diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml new file mode 100644 index 0000000..5910c1a --- /dev/null +++ b/.github/workflows/test-coverage.yaml @@ -0,0 +1,48 @@ +on: + push: + branches: + - main + - master + pull_request: + branches: + - main + - master + +name: test-coverage + +jobs: + test-coverage: + runs-on: macOS-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-r@v1 + + - uses: r-lib/actions/setup-pandoc@v1 + + - name: Query dependencies + run: | + install.packages('remotes') + saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) + writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version") + shell: Rscript {0} + + - name: Cache R packages + uses: actions/cache@v2 + with: + path: ${{ env.R_LIBS_USER }} + key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }} + restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1- + + - name: Install dependencies + run: | + install.packages(c("remotes")) + remotes::install_deps(dependencies = TRUE) + remotes::install_cran("covr") + shell: Rscript {0} + + - name: Test coverage + run: covr::codecov() + shell: Rscript {0} diff --git a/DESCRIPTION b/DESCRIPTION index 66df017..9f66d7c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: ContDataQC Title: Quality Control (QC) of Continous Monitoring Data -Version: 2.0.5.9043 +Version: 2.0.5.9044 Authors@R: c( person("Erik W", "Leppo", email="Erik.Leppo@tetratech.com",role=c("aut","cre")), person("Ann","Roseberry Lincoln", role="ctb"), diff --git a/NEWS b/NEWS index 66da93b..86f7236 100644 --- a/NEWS +++ b/NEWS @@ -3,7 +3,7 @@ NEWS-ContDataQC - #> Last Update: 2020-12-25 20:00:48 + #> Last Update: 2020-12-25 20:07:33 # Planned Updates @@ -37,6 +37,14 @@ NEWS-ContDataQC # Version History +## v2.0.5.9044 + +2020-12-25 + + - ci: Add GitHub Action test-coverage + - docs: ReadMe, Add codecov badge + - docs: ReadMe, Add codefactor badge + ## v2.0.5.9043 2020-12-25 diff --git a/NEWS.rmd b/NEWS.rmd index 7b2d510..318f0cf 100644 --- a/NEWS.rmd +++ b/NEWS.rmd @@ -46,6 +46,13 @@ cat(paste0("Last Update: ",Sys.time())) # Version History +## v2.0.5.9044 +2020-12-25 + +* ci: Add GitHub Action test-coverage +* docs: ReadMe, Add codecov badge +* docs: ReadMe, Add codefactor badge + ## v2.0.5.9043 2020-12-25 diff --git a/README.Rmd b/README.Rmd index 05fcd2b..02dad53 100644 --- a/README.Rmd +++ b/README.Rmd @@ -23,9 +23,11 @@ Quality control checks on continuous data. Example data is from a HOBO data log Badges ----------- [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://GitHub.com/leppott/ContDataQC/graphs/commit-activity) -[![](https://img.shields.io/badge/lifecycle-stable-green.svg)](https://www.tidyverse.org/lifecycle/#stable) +[![lifecycle](https://img.shields.io/badge/lifecycle-stable-green.svg)](https://www.tidyverse.org/lifecycle/#stable) [![GitHub license](https://img.shields.io/github/license/leppott/ContDataQC.svg)](https://github.com/leppott/ContDataQC/blob/master/LICENSE) +[![CodeFactor](https://www.codefactor.io/repository/github/leppott/ContDataQC/badge)](https://www.codefactor.io/repository/github/leppott/ContDataQC) +[![codecov](https://codecov.io/gh/leppott/ContDataQC/branch/master/graph/badge.svg)](https://codecov.io/gh/leppott/ContDataQC) [![R-CMD-check](https://github.com/leppott/ContDataQC/workflows/R-CMD-check/badge.svg)](https://github.com/leppott/ContDataQC/actions) [![GitHub issues](https://img.shields.io/github/issues/leppott/ContDataQC.svg)](https://GitHub.com/leppott/ContDataQC/issues/) diff --git a/README.md b/README.md index 5eede3f..a35e3d4 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ README-ContDataQC - #> Last Update: 2020-12-25 19:59:34 + #> Last Update: 2020-12-25 20:07:06 # ContDataQC @@ -13,10 +13,12 @@ data logger with 30 minute intervals. ## Badges [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://GitHub.com/leppott/ContDataQC/graphs/commit-activity) -[![](https://img.shields.io/badge/lifecycle-stable-green.svg)](https://www.tidyverse.org/lifecycle/#stable) +[![lifecycle](https://img.shields.io/badge/lifecycle-stable-green.svg)](https://www.tidyverse.org/lifecycle/#stable) [![GitHub license](https://img.shields.io/github/license/leppott/ContDataQC.svg)](https://github.com/leppott/ContDataQC/blob/master/LICENSE) +[![CodeFactor](https://www.codefactor.io/repository/github/leppott/ContDataQC/badge)](https://www.codefactor.io/repository/github/leppott/ContDataQC) +[![codecov](https://codecov.io/gh/leppott/ContDataQC/branch/master/graph/badge.svg)](https://codecov.io/gh/leppott/ContDataQC) [![R-CMD-check](https://github.com/leppott/ContDataQC/workflows/R-CMD-check/badge.svg)](https://github.com/leppott/ContDataQC/actions) [![GitHub diff --git a/inst/extdata/ContDataQC_LibraryCreation.Rmd b/inst/extdata/ContDataQC_LibraryCreation.Rmd index 5fbc98b..497c9f4 100644 --- a/inst/extdata/ContDataQC_LibraryCreation.Rmd +++ b/inst/extdata/ContDataQC_LibraryCreation.Rmd @@ -219,7 +219,7 @@ Can make some badges dynamic, static ones below [![Github all releases](https://img.shields.io/github/downloads/leppott/MBSStools/total.svg)](https://GitHub.com/leppott/MBSStools/releases/) ```{r} -pkg_GH <- "leppott/BioMonTools" +pkg_GH <- "leppott/ContDataQC" pkg_lic <- "MIT" # GitHub Action, CI diff --git a/inst/extdata/ContDataQC_LibraryCreation.nb.html b/inst/extdata/ContDataQC_LibraryCreation.nb.html index cbf9288..bdbbb79 100644 --- a/inst/extdata/ContDataQC_LibraryCreation.nb.html +++ b/inst/extdata/ContDataQC_LibraryCreation.nb.html @@ -1770,7 +1770,7 @@

ContDataQC

Library Creation

Erik.Leppo@tetratech.com

-

2020-12-25 19:53:19

+

2020-12-25 20:05:15

@@ -2023,8 +2023,8 @@

issues

GitHub issues # release GitHub release # downloads Github all releases

- -
pkg_GH <- "leppott/BioMonTools"
+
+
pkg_GH <- "leppott/ContDataQC"
 pkg_lic <- "MIT"
 
 # GitHub Action, CI
@@ -2141,7 +2141,7 @@ 

Test Stats only

-
LS0tDQp0aXRsZTogIkNvbnREYXRhUUMiDQpzdWJ0aXRsZTogIkxpYnJhcnkgQ3JlYXRpb24iDQphdXRob3I6ICJFcmlrLkxlcHBvQHRldHJhdGVjaC5jb20iDQpkYXRlOiAiYHIgU3lzLnRpbWUoKWAiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IG5vDQotLS0NCg0KSGVscGVyIGNvZGUgZm9yIGNyZWF0aW5nIGxpYnJhcnkuDQoNCkVyaWsuTGVwcG9AdGV0cmF0ZWNoLmNvbQ0KMjAxNy0wOS0yNg0KDQojIFBhY2thZ2UNCg0KUGFja2FnZSByZWxhdGVkIGNvZGUuDQoNCiMjIFZpZ25ldHRlDQoNCjEuIE5lZWQgdG8gcnVuIGNvZGUgYmVsb3cgdG8gYWRkIGRhdGEgdG8gInZpZ25ldHRlIiBkaXJlY3Rvcnkgc28gaXQgd2lsbCB3b3JrLg0KDQpgYGB7ciBWaWduZXR0ZV9EYXRhLCBldmFsPUZBTFNFfQ0KIyAxLiBjaGFuZ2Ugd2QgdG8gdmlnbmV0dGVzDQpzZXR3ZChmaWxlLnBhdGgoIkM6IiwiVXNlcnMiLCJFcmlrLkxlcHBvIiwiT25lRHJpdmUgLSBUZXRyYSBUZWNoLCBJbmMiDQogICAgICAgICAgICAgICAgLCJNeURvY3NfT25lRHJpdmUiLCJHaXRIdWIiLCJDb250RGF0YVFDIiwidmlnbmV0dGVzIikpDQojDQojIDIuIEFkZCBkYXRhIGZvciB2aWduZXR0ZSBleGFtcGxlcw0KIyBQYXJhbWV0ZXJzDQpTZWxlY3Rpb24uT3BlcmF0aW9uIDwtIGMoIkdldEdhZ2VEYXRhIiwiUUNSYXciLCAiQWdncmVnYXRlIiwgIlN1bW1hcnlTdGF0cyIpDQpTZWxlY3Rpb24uVHlwZSAgICAgIDwtIGMoIkFpciIsIldhdGVyIiwiQVciLCJHYWdlIiwiQVdHIiwiQUciLCJXRyIpDQpTZWxlY3Rpb24uU1VCIDwtIGMoIkRhdGExX1JBVyIsIkRhdGEyX1FDIiwiRGF0YTNfQWdncmVnYXRlZCIsIkRhdGE0X1N0YXRzIikNCm15RGlyLkJBU0UgPC0gZ2V0d2QoKQ0KIw0KIyBDcmVhdGUgZGF0YSBkaXJlY3Rvcmllcw0KbXlEaXIuY3JlYXRlIDwtIHBhc3RlMCgiLi8iLFNlbGVjdGlvbi5TVUJbMV0pDQogIGlmZWxzZShkaXIuZXhpc3RzKG15RGlyLmNyZWF0ZSk9PUZBTFNFLGRpci5jcmVhdGUobXlEaXIuY3JlYXRlKSwiRGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIikNCm15RGlyLmNyZWF0ZSA8LSBwYXN0ZTAoIi4vIixTZWxlY3Rpb24uU1VCWzJdKQ0KICBpZmVsc2UoZGlyLmV4aXN0cyhteURpci5jcmVhdGUpPT1GQUxTRSxkaXIuY3JlYXRlKG15RGlyLmNyZWF0ZSksIkRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyIpDQpteURpci5jcmVhdGUgPC0gcGFzdGUwKCIuLyIsU2VsZWN0aW9uLlNVQlszXSkNCiAgaWZlbHNlKGRpci5leGlzdHMobXlEaXIuY3JlYXRlKT09RkFMU0UsZGlyLmNyZWF0ZShteURpci5jcmVhdGUpLCJEaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMiKQ0KbXlEaXIuY3JlYXRlIDwtIHBhc3RlMCgiLi8iLFNlbGVjdGlvbi5TVUJbNF0pDQogIGlmZWxzZShkaXIuZXhpc3RzKG15RGlyLmNyZWF0ZSk9PUZBTFNFLGRpci5jcmVhdGUobXlEaXIuY3JlYXRlKSwiRGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIikNCiMNCiMgU2F2ZSBleGFtcGxlIGRhdGEgKGFzc3VtZXMgZGlyZWN0b3J5IC4vRGF0YTFfUkFXLyBleGlzdHMpDQpteURhdGEgPC0gZGF0YV9yYXdfdGVzdDJfQVdfMjAxMzA0MjZfMjAxMzA3MjUNCiAgd3JpdGUuY3N2KG15RGF0YSxwYXN0ZTAoIi4vIixTZWxlY3Rpb24uU1VCWzFdLCIvdGVzdDJfQVdfMjAxMzA0MjZfMjAxMzA3MjUuY3N2IikpDQpteURhdGEgPC0gZGF0YV9yYXdfdGVzdDJfQVdfMjAxMzA3MjVfMjAxMzEwMTUNCiAgd3JpdGUuY3N2KG15RGF0YSxwYXN0ZTAoIi4vIixTZWxlY3Rpb24uU1VCWzFdLCIvdGVzdDJfQVdfMjAxMzA3MjVfMjAxMzEwMTUuY3N2IikpDQpteURhdGEgPC0gZGF0YV9yYXdfdGVzdDJfQVdfMjAxNDA5MDFfMjAxNDA5MzANCiAgd3JpdGUuY3N2KG15RGF0YSxwYXN0ZTAoIi4vIixTZWxlY3Rpb24uU1VCWzFdLCIvdGVzdDJfQVdfMjAxNDA5MDFfMjAxNDA5MzAuY3N2IikpDQpteURhdGEgPC0gZGF0YV9yYXdfdGVzdDRfQVdfMjAxNjA0MThfMjAxNjA3MjYNCiAgd3JpdGUuY3N2KG15RGF0YSxwYXN0ZTAoIi4vIixTZWxlY3Rpb24uU1VCWzFdLCIvdGVzdDRfQVdfMjAxNjA0MThfMjAxNjA3MjYuY3N2IikpDQpteUZpbGUgPC0gImNvbmZpZy5UWi5DZW50cmFsLlIiDQogIGZpbGUuY29weShmaWxlLnBhdGgocGF0aC5wYWNrYWdlKCJDb250RGF0YVFDIiksImV4dGRhdGEiLG15RmlsZSkNCiAgICAgICAgICAgICxmaWxlLnBhdGgoZ2V0d2QoKSxTZWxlY3Rpb24uU1VCWzFdLG15RmlsZSkpDQpgYGANCg0KMi4gS25pdCB0aGUgdmlnbmV0dGUgaW4gdGhlIHZpZ25ldHRlIGZvbGRlciB0byBlbnN1cmUgYWxsIG9mIHRoZSBjb2RlIHdvcmtzIGFuZCANCmlzIHByb3Blcmx5IGRpc3BsYXllZC4gIFRoaXMgY2FuIHRha2UgMiB0byA1IG1pbi4NCg0KMy4gVXNlIHRoZSBjb2RlIGJlbG93IHRvICJidWlsZCIgdGhlIHZpZ25ldHRlIGFuZCB0aGVuIHVzZSBpdCBpbiB0aGUgcGtnLg0KDQpgYGB7ciBWaWduZXR0ZV9CdWlsZCwgZXZhbD1GQUxTRX0NCiMgZ2VuZXJhdGUgVmlnbmV0dGUNCmxpYnJhcnkoQ29udERhdGFRQykNCmxpYnJhcnkoZGV2dG9vbHMpDQpkZXZ0b29sczo6YnVpbGRfdmlnbmV0dGVzKCkNCg0KIyBjcmVhdGUgdmlnbmV0dGUgZm9sZGVyIGFuZCBkZWZhdWx0IGZpbGUNCiNkZXZ0b29sczo6dXNlX3ZpZ25ldHRlKCJDb250RGF0YVFDX1ZpZ25ldHRlIikNCmBgYA0KZGV2dG9vbHM6OmJ1aWxkKCkgbW9yZSB1c2VmdWwgYW5kIGJ1aWxkX3ZpZ25ldHRlcygpDQoNCiMjIENyZWF0ZSBQYWNrYWdlDQpVc2UgdGhlIGNvZGUgYmVsb3cgdG8gY3JlYXRlIHRoZSBwYWNrYWdlLiAgQXNzdW1lcyB5b3UgYXJlIGluIHRoZSBkZXZlbG9wbWVudCBwYWNrYWdlIGRpcmVjdG9yeQ0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5DQpteUxpYnJhcnkgPC0gIkNvbnREYXRhUUMiDQpkaXJfYmFzZSA8LSAiQzovVXNlcnMvRXJpay5MZXBwby9PbmVEcml2ZSAtIFRldHJhIFRlY2gsIEluYy9NeURvY3NfT25lRHJpdmUvR2l0SHViIg0Kc2V0d2QoZmlsZS5wYXRoKGRpcl9iYXNlLCBteUxpYnJhcnkpKQ0KIw0KIyBORVdTDQojIFJlbmRlciB0aGVuIENvcHkgTkVXUyBzbyBwaWNrZWQgdXAgaW4gaGVscA0Kcm1hcmtkb3duOjpyZW5kZXIoIk5FV1Mucm1kIiwgImFsbCIpDQpmaWxlLmNvcHkoIk5FV1MubWQiLCAiTkVXUyIsIG92ZXJ3cml0ZSA9IFRSVUUpDQpmaWxlLnJlbW92ZSgiTkVXUy5odG1sIikNCmZpbGUucmVtb3ZlKCJORVdTLm1kIikNCiMNCiMgTG9hZCBMaWJyYXJ5DQpsaWJyYXJ5KGRldnRvb2xzKQ0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCiMgQ3JlYXRlIFBhY2thZ2UNCiMgY3JlYXRlKG15TGlicmFyeSkNCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojIERvY3VtZW50LCBJbnN0YWxsLCBhbmQgUmVsb2FkIExpYnJhcnkNCiMjIEdlbmVyYXRlIERvY3VtZW50YXRpb24NCmRldnRvb2xzOjpkb2N1bWVudCgpDQojIyBJbnN0YWxsIE5ldyBQYWNrYWdlIChsb2NhbGx5KQ0Kc2V0d2QoIi4uIikgIyByZXR1cm4gdG8gcm9vdCBkaXJlY3RvcnkgZmlyc3QNCmRldnRvb2xzOjppbnN0YWxsKG15TGlicmFyeSwgYnVpbGRfdmlnbmV0dGVzID0gVFJVRSwgcXVpY2sgPSBGQUxTRSwgcmVsb2FkID0gVFJVRSkNCg0KIyMgUmVsb2FkIGxpYnJhcnkNCmxpYnJhcnkobXlMaWJyYXJ5LGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCiMgY2hhbmdlIHdkIGJhY2sgdG8gcGFja2FnZQ0Kc2V0d2QoZmlsZS5wYXRoKGRpcl9iYXNlLCBteUxpYnJhcnkpKQ0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCmBgYA0KDQpBZnRlciBjcmVhdGluZyB0aGUgcGFja2FnZSByZWxvYWQgaXQgYWZ0ZXIgcmVzdGFydGluZyBSIHdpdGhpbiBSU3R1ZGlvIChDdHJsICsgU2hpZnQgKyBGMTApLg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMgUmVzdGFydCBSIHdpdGhpbiBSU3R1ZGlvOiAgQ3RybCArIFNoaWZ0ICsgRjEwDQpwa2cgPC0gIkNvbnREYXRhUUMiDQpsaWJyYXJ5KHBrZywgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KaGVscChwYWNrYWdlPShwa2cpKQ0KIw0KP1BlcmlvZFN0YXRzDQojP0NvbXBTaXRlQ0RGDQo/P0NvbnREYXRhUUMNCj9mdW4uRXhwb3J0LklIQQ0KP0V4cG9ydC5TdHJlYW1UaGVybWFsICANCmBgYA0KDQpQYWNrYWdlIHdlYnNpdGUNClVzZSBwa2dkb3duIHRvIGNyZWF0ZSBzaXRlLg0KDQpodHRwczovL3d3dy5yLWJsb2dnZXJzLmNvbS90dnRoZW1lcy0xLTEtMC1pcy1vbi1jcmFuLWNyZWF0aW5nLWEtcGtnZG93bi13ZWJzaXRlLWdyYXZpdHktZmFsbHMtcGFsZXR0ZS1hbmQtbW9yZS8NCg0KYGBge3IgUGtnZG93biwgZXZhbD1GQUxTRX0NCiNsaWJyYXJ5KHBrZ2Rvd24pDQoNCnVzZXRoaXM6OnVzZV9wa2dkb3duKCkNCnBrZ2Rvd246OmJ1aWxkX3NpdGUoKQ0KDQpgYGANCg0KDQoNClRlc3Rpbmcgb2YgY29uZmlndXJhdGlvbiBhbmQgUk1EIGZpbGVzLg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCmxpYnJhcnkoQ29udERhdGFRQykNCiMgUGFyYW1ldGVycw0KU2VsZWN0aW9uLk9wZXJhdGlvbiA8LSBjKCJHZXRHYWdlRGF0YSIsIlFDUmF3IiwgIkFnZ3JlZ2F0ZSIsICJTdW1tYXJ5U3RhdHMiKQ0KU2VsZWN0aW9uLlR5cGUgICAgICA8LSBjKCJBaXIiLCJXYXRlciIsIkFXIiwiR2FnZSIsIkFXRyIsIkFHIiwiV0ciKQ0KU2VsZWN0aW9uLlNVQiA8LSBjKCJEYXRhMV9SQVciLCJEYXRhMl9RQyIsIkRhdGEzX0FnZ3JlZ2F0ZWQiLCJEYXRhNF9TdGF0cyIpDQpteURpci5CQVNFIDwtIGdldHdkKCkNCiMNCiMgQWdncmVnYXRlIERhdGENCm15RGF0YS5PcGVyYXRpb24gPC0gIkFnZ3JlZ2F0ZSIgI1NlbGVjdGlvbi5PcGVyYXRpb25bM10NCm15RGF0YS5TaXRlSUQgICAgPC0gInRlc3QyIg0KbXlEYXRhLlR5cGUgICAgICA8LSBTZWxlY3Rpb24uVHlwZVszXSAjIkFXIg0KbXlEYXRhLkRhdGVSYW5nZS5TdGFydCAgPC0gIjIwMTMtMDEtMDEiDQpteURhdGEuRGF0ZVJhbmdlLkVuZCAgICA8LSAiMjAxNC0xMi0zMSINCm15RGlyLmltcG9ydCA8LSBmaWxlLnBhdGgobXlEaXIuQkFTRSxTZWxlY3Rpb24uU1VCWzJdKSAjIkRhdGEyX1FDIg0KbXlEaXIuZXhwb3J0IDwtIGZpbGUucGF0aChteURpci5CQVNFLFNlbGVjdGlvbi5TVUJbM10pICMiRGF0YTNfQWdncmVnYXRlZCINCm15UmVwb3J0LmZvcm1hdCA8LSAiZG9jeCINCiMNCiMgc2V0IGNvbmZpZyBmaWxlIHdpdGggUk1EIGRpcmVjdG9yeSBhcyBnZXR3ZCgpDQpteUNvbmZpZyAgICAgICAgICAgIDwtIGZpbGUucGF0aChnZXR3ZCgpLFNlbGVjdGlvbi5TVUJbMl0sImNvbmZpZy5STURkaXIuUiIpDQojIHJ1biBmdW5jdGlvbg0KQ29udERhdGFRQyhteURhdGEuT3BlcmF0aW9uLCBteURhdGEuU2l0ZUlELCBteURhdGEuVHlwZSwgbXlEYXRhLkRhdGVSYW5nZS5TdGFydA0KICAgICAgICAgICAsIG15RGF0YS5EYXRlUmFuZ2UuRW5kLCBteURpci5pbXBvcnQsIG15RGlyLmV4cG9ydA0KICAgICAgICAgICAsIGZ1bi5teVJlcG9ydC5mb3JtYXQ9bXlSZXBvcnQuZm9ybWF0LCBmdW4ubXlDb25maWcgPSBteUNvbmZpZykNCmBgYA0KDQoNCiMjIEluY2x1ZGluZyBEYXRhDQpBbGwgZGF0YSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gY3JlYXRlZC4NCg0KIyMgQ2hlY2sNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojIENoZWNrIGZvciBlcnJvcnMgKG9yIHByZXNzIENtZCArIFNoaWZ0ICsgRSBpbiBSU3R1ZGlvKQ0KI2h0dHA6Ly9yLXBrZ3MuaGFkLmNvLm56L2NoZWNrLmh0bWwNCmRldnRvb2xzOjpjaGVjaygpDQpgYGANCg0KSWYgdXNlIFJTdHVkaW8sIEJ1aWxkIC0gQ2hlY2sgUGFja2FnZSwgdGhlIG91dHB1dCBpcyBlYXNpZXIgdG8gcmVhZC4gDQoNCiMjIFRlc3QNCk5lZWQgdG8gdXNlIHRlc3R0aGF0IGJ1dCBub3QgdG8gdGhhdCBzdGFnZSB5ZXQuDQoNClJTdHVkaW8sIEJ1aWxkIC0gVGVzdCBQYWNrYWdlLg0KDQojIENJLCBCYWRnZXMsIENvZGUgQ292ZXJhZ2UsIGV0Yw0KKiBDb250aW51b3VzIEludGVncmF0aW9uIHdpdGggR2l0SHViIEFjdGlvbnMgKFRyYXZpc0NJIHNodXQgZG93biBEZWMgMjAyMCkNCiogQ29kZSBRdWFsaXR5IChDb2RlRmFjdG9yKQ0KICAgICsgQ29kZUZhY3Rvci5pbw0KICAgICAgICAtIEdpdEh1YiBsb2dpbg0KKiBDb2RlIENvdmVyYWdlICh0ZXN0aW5nKQ0KICAgICsgQ29kZWNvdi5pbw0KICAgICAgICAtIEdpdEh1YiBsb2dpbg0KICAgICAgICAtIEFmdGVyIHNldCB1cCBDSSB3aXRoIEdpdEh1YiBBY3Rpb25zDQoqIFBhY2thZ2Ugd2Vic2l0ZSAocGtnZG93biBhbmQgR2l0SHViIEFjdGlvbikNCiAgICArIGJyYW5jaCBnaC1wYWdlcywgYXV0byB1cGRhdGVzIHdpdGggZWFjaCBjb21taXQNCiAgICArIFVwZGF0ZSBpbiBzZXR0aW5ncyB0aGUgbG9jYXRpb24NCiogQmFkZ2VzOyBNYWludGFpbmVkLCBMaWZlIEN5Y2xlLCBMaWNlbnNlLCBJc3N1ZXMsIGV0Yw0KICAgICsgaHR0cHM6Ly9naXRodWIuY29tL0d1YW5nY2h1YW5nWXUvYmFkZ2VyDQogICAgICAgIC0gQ29tbWFuZHMgdG8gY3JlYXRlIGJhZGdlcw0KDQpiYWRnZXIgcGFja2FnZSBjcmVhdGVzIHRoZSB0ZXh0IGZvciBwa2cgcmVhZG1lIGZpbGUuDQogICAgICAgIA0KQWxzbw0KaHR0cHM6Ly9zaGllbGRzLmlvLyAgICAgICAgDQpodHRwczovL2dpdGh1Yi5jb20vYmFkZ2VzL3NoaWVsZHMNCkNhbiBtYWtlIHNvbWUgYmFkZ2VzIGR5bmFtaWMsIHN0YXRpYyBvbmVzIGJlbG93DQoNCiMgaXNzdWVzDQpbIVtHaXRIdWIgaXNzdWVzXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9pc3N1ZXMvbGVwcG90dC9NQlNTdG9vbHMuc3ZnKV0oaHR0cHM6Ly9HaXRIdWIuY29tL2xlcHBvdHQvTUJTU3Rvb2xzL2lzc3Vlcy8pDQojIHJlbGVhc2UNClshW0dpdEh1YiByZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9yZWxlYXNlL2xlcHBvdHQvTUJTU3Rvb2xzLnN2ZyldKGh0dHBzOi8vR2l0SHViLmNvbS9sZXBwb3R0L01CU1N0b29scy9yZWxlYXNlcy8pDQojIGRvd25sb2Fkcw0KWyFbR2l0aHViIGFsbCByZWxlYXNlc10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvZG93bmxvYWRzL2xlcHBvdHQvTUJTU3Rvb2xzL3RvdGFsLnN2ZyldKGh0dHBzOi8vR2l0SHViLmNvbS9sZXBwb3R0L01CU1N0b29scy9yZWxlYXNlcy8pDQogICAgICAgIA0KYGBge3J9DQpwa2dfR0ggPC0gImxlcHBvdHQvQmlvTW9uVG9vbHMiDQpwa2dfbGljIDwtICJNSVQiDQoNCiMgR2l0SHViIEFjdGlvbiwgQ0kNCnVzZXRoaXM6OnVzZV9naXRodWJfYWN0aW9ucygpDQp1c2V0aGlzOjp1c2VfZ2l0aHViX2FjdGlvbnNfYmFkZ2UoKQ0KIyBiYWRnZXI6OmJhZGdlX2dpdGh1Yl9hY3Rpb25zKHBrZ19HSCkNCg0KIyBjb2RlIGNvdmVyYWdlDQp1c2V0aGlzOjp1c2VfZ2l0aHViX2FjdGlvbigidGVzdC1jb3ZlcmFnZSIpDQoNCiMgR2l0SHViIEFjdGlvbiwgcGtnZG93bg0KdXNldGhpczo6dXNlX2dpdGh1Yl9hY3Rpb24oInBrZ2Rvd24iKQ0KDQojIEJhZGdlcw0KIyBsaWZlY3ljbGUNCmJhZGdlcjo6YmFkZ2VfbGlmZWN5Y2xlKCJzdGFibGUiLCAiZ3JlZW4iKSAjIHN0YWJsZS9ncmVlbiwgbWF0dXJpbmcvZG9ybWFudC9ibHVlDQojIG1haW50YWluZWQNCiMgbGljZW5zZQ0KYmFkZ2VyOjpiYWRnZV9saWNlbnNlKHBrZ19saWMpDQojIGNvZGUgcXVhbGl0eQ0KYmFkZ2VyOjpiYWRnZV9jb2RlZmFjdG9yKHBrZ19HSCkNCiMgY29kZSB0ZXN0aW5nIGNvdmVyYWdlDQpiYWRnZXI6OmJhZGdlX2NvZGVjb3YocGtnX0dIKQ0KIyBjbWQgY2hlY2sNCmJhZGdlcjo6YmFkZ2VfZ2l0aHViX2FjdGlvbnMocGtnX0dIKQ0KDQoNCmBgYA0KDQoNCg0KIyBPdGhlciBTdHVmZg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojIFVwbG9hZCB0byBHaXRodWIgdmlhIEdpdEh1YiBEZXNrdG9wIHV0aWxpdHkNCiMgMC4gZG93bmxvYWQgZnJvbSB3ZWIgdmlhICJjbG9uZSBvciBkb3dubG9hZCIgdmlhICJPcGVuIGluIERlc2t0b3AiIChHaXRIdWIgRGVza3RvcCkgaWYgbm90IGFscmVhZHkgaW4gR2l0SHViIERlc2t0b3ANCiMgMS4gTWFrZSBjaGFuZ2VzIGluIGRvd25sb2FkL2Nsb25lIGZvbGRlci4gKGRvbmUgYWJvdmUpDQojIDMuIE9wZW4gR0ggRGVza3RvcCBjb21taXQgY2hhbmdlcyB0aGVuIHN5bmMuDQojfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fg0KIyBpbnN0YWxsIGZyb20gR2l0SHViICh2aWEgZGV2dG9vbHMpDQpteUxpYnJhcnkgPC0gIkNvbnREYXRhUUMiDQpkZXZ0b29sczo6aW5zdGFsbF9naXRodWIocGFzdGUwKCJsZXBwb3R0LyIsbXlMaWJyYXJ5KSkNCiMNCg0KDQoNCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojIHJlbW92ZSBpbnN0YWxsZWQgcGFja2FnZXMgKGlmIG5lZWRlZCBmb3IgdHJvdWJsZXNob290aW5nKQ0Kc2VhcmNoKCkgIyBmaW5kDQojZGV0YWNoKDMpICMgcmVtb3ZlIGJ5IG51bWJlcg0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCg0KDQojIHRvIGJ1aWxkIHBhY2thZ2UNCiNodHRwczovL3RoZXBvbGl0aWNhbG1ldGhvZG9sb2dpc3QuY29tLzIwMTQvMDgvMTQvYnVpbGRpbmctYW5kLW1haW50YWluaW5nLXItcGFja2FnZXMtd2l0aC1kZXZ0b29scy1hbmQtcm94eWdlbjIvDQojIFRvIGJ1aWxkIHRoZSBwYWNrYWdlIGFzIGEgY29tcHJlc3NlZCBmaWxlIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnksIHJ1biBidWlsZChjdXJyZW50LmNvZGUsIHBhdGg9Z2V0d2QoKSkuDQoNCiMgdG8gc2F2ZSBpbnRlcm5hbCBkYXRhIGZvciBleGFtcGxlcw0KIyBleGFtcGxlDQojaHR0cDovL3ItcGtncy5oYWQuY28ubnovZGF0YS5odG1sI2RhdGEtc3lzZGF0YQ0KIyBoYXZlIHRvIGJlIGF0IHJvb3QgZGlyZWN0b3J5IChhYm92ZSBwYWNrYWdlKQ0KI2RldnRvb2xzOjp1c2VfZGF0YShOVi5wcmVkaWN0b3JzLE5WLmJ1Z3MscGtnPSJNTUljYWxjTlYiLGludGVybmFsPVRSVUUsb3ZlcndyaXRlPVRSVUUpDQojIyB2ZXJpZnkgd2l0aCBkYXRhKCkNCg0KIyBUbyBzYXZlIFJNRCBmaWxlcw0KIyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMwMzc3MjEzL2hvdy10by1pbmNsdWRlLXJtYXJrZG93bi1maWxlLWluLXItcGFja2FnZQ0KIyAvcGtnL2luc3Qvcm1kLw0KIyBzeXN0ZW0uZmlsZSgicm1kL2ZpbGUuUm1kIiwgcGFja2FnZT0icGFja2FnZW5hbWUiKQ0KIw0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCiNodHRwczovL2hpbGFyeXBhcmtlci5jb20vMjAxNC8wNC8yOS93cml0aW5nLWFuLXItcGFja2FnZS1mcm9tLXNjcmF0Y2gvDQojIENyZWF0ZSBQYWNrYWdlDQojIGNyZWF0ZShteUxpYnJhcnkpDQoNCmBgYA0KDQojIFRlc3QgU3RhdHMgb25seQ0KDQoNCmBgYHtyIFN0YXRzX0dhZ2UsIGV2YWw9RkFMU0V9DQojIFBhcmFtZXRlcnMNClNlbGVjdGlvbi5PcGVyYXRpb24gPC0gYygiR2V0R2FnZURhdGEiLCJRQ1JhdyIsICJBZ2dyZWdhdGUiLCAiU3VtbWFyeVN0YXRzIikNClNlbGVjdGlvbi5UeXBlICAgICAgPC0gYygiQWlyIiwiV2F0ZXIiLCJBVyIsIkdhZ2UiLCJBV0ciLCJBRyIsIldHIikNClNlbGVjdGlvbi5TVUIgPC0gYygiRGF0YTFfUkFXIiwiRGF0YTJfUUMiLCJEYXRhM19BZ2dyZWdhdGVkIiwiRGF0YTRfU3RhdHMiKQ0KbXlEaXIuQkFTRSA8LSBnZXR3ZCgpDQojDQojIFN1bW1hcnkgU3RhdHMsIEZpbGUNCiMjIEhhdmUgdG8gdXNlICJmaWxlIiB2ZXJzaW9uLiAgDQojIyBCYXNlIHZlcnNpb24gYnVpbGRzIGZpbGUgbmFtZSBhbmQgZXhwZWN0cyAiREFUQSIgcHJlZml4DQoNCiMgR2FnZSBGaWxlICsgT3RoZXIgRmlsZQ0KbXlEYXRhLk9wZXJhdGlvbiA8LSAiU3VtbWFyeVN0YXRzIiAjU2VsZWN0aW9uLk9wZXJhdGlvbls0XQ0KbXlGaWxlIDwtIGMoIkRhdGE0U3RhdHNfMDExODczMDBfR2FnZV8yMDEzMDEwMV8yMDE0MTIzMS5jc3YiDQogICAgICAgICAgICAsIkRhdGE0U3RhdHNfdGVzdDJfQXdfMjAxMzAxMDFfMjAxNDEyMzEuY3N2IikNCm15RGlyLmltcG9ydCA8LSBmaWxlLnBhdGgoIi4iLCJkYXRhLXJhdyIpDQpteURpci5leHBvcnQgPC0gZmlsZS5wYXRoKCIuIiwiRGF0YTRfU3RhdHMiKQ0KDQojTGVhdmUgb2ZmIG15UmVwb3J0LmZvcm1hdCBhbmQgZ2V0IGRlZmF1bHQgKGRvY3gpLg0KQ29udERhdGFRQyhteURhdGEuT3BlcmF0aW9uDQogICAgICAgICAgICwgZnVuLm15RGlyLmltcG9ydD1teURpci5pbXBvcnQNCiAgICAgICAgICAgLCBmdW4ubXlEaXIuZXhwb3J0PW15RGlyLmV4cG9ydA0KICAgICAgICAgICAsIGZ1bi5teUZpbGU9bXlGaWxlKQ0KDQoNCmBgYA0KDQpTaXRlSUQsIERhdGUsIFRpbWUsIERhdGUuVGltZSwgUGFyYW1ldGVycywgRmxhZy5QYXJhbWV0ZXJzDQoNCk9ubHkgb25lIGZsYWcgcGVyIHBhcmFtZXRlci4gIERvIG5vdCBuZWVkIGluZGl2aWR1YWwgdGVzdCBmbGFncy4NCg0KIkYiIChmYWlsKSBmbGFncyBhcmUgY2hhbmdlZCB0byBOQSBzbyB0aGV5IGFyZSBkcm9wcGVkIGZyb20gdGhlIHN0YXRpc3RpY3MgdGhhdCBjYWxjdWxhdGVkLg0KDQpNb2NrZWQgdXAgMiBmaWxlcy4NCg==
+
LS0tDQp0aXRsZTogIkNvbnREYXRhUUMiDQpzdWJ0aXRsZTogIkxpYnJhcnkgQ3JlYXRpb24iDQphdXRob3I6ICJFcmlrLkxlcHBvQHRldHJhdGVjaC5jb20iDQpkYXRlOiAiYHIgU3lzLnRpbWUoKWAiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IG5vDQotLS0NCg0KSGVscGVyIGNvZGUgZm9yIGNyZWF0aW5nIGxpYnJhcnkuDQoNCkVyaWsuTGVwcG9AdGV0cmF0ZWNoLmNvbQ0KMjAxNy0wOS0yNg0KDQojIFBhY2thZ2UNCg0KUGFja2FnZSByZWxhdGVkIGNvZGUuDQoNCiMjIFZpZ25ldHRlDQoNCjEuIE5lZWQgdG8gcnVuIGNvZGUgYmVsb3cgdG8gYWRkIGRhdGEgdG8gInZpZ25ldHRlIiBkaXJlY3Rvcnkgc28gaXQgd2lsbCB3b3JrLg0KDQpgYGB7ciBWaWduZXR0ZV9EYXRhLCBldmFsPUZBTFNFfQ0KIyAxLiBjaGFuZ2Ugd2QgdG8gdmlnbmV0dGVzDQpzZXR3ZChmaWxlLnBhdGgoIkM6IiwiVXNlcnMiLCJFcmlrLkxlcHBvIiwiT25lRHJpdmUgLSBUZXRyYSBUZWNoLCBJbmMiDQogICAgICAgICAgICAgICAgLCJNeURvY3NfT25lRHJpdmUiLCJHaXRIdWIiLCJDb250RGF0YVFDIiwidmlnbmV0dGVzIikpDQojDQojIDIuIEFkZCBkYXRhIGZvciB2aWduZXR0ZSBleGFtcGxlcw0KIyBQYXJhbWV0ZXJzDQpTZWxlY3Rpb24uT3BlcmF0aW9uIDwtIGMoIkdldEdhZ2VEYXRhIiwiUUNSYXciLCAiQWdncmVnYXRlIiwgIlN1bW1hcnlTdGF0cyIpDQpTZWxlY3Rpb24uVHlwZSAgICAgIDwtIGMoIkFpciIsIldhdGVyIiwiQVciLCJHYWdlIiwiQVdHIiwiQUciLCJXRyIpDQpTZWxlY3Rpb24uU1VCIDwtIGMoIkRhdGExX1JBVyIsIkRhdGEyX1FDIiwiRGF0YTNfQWdncmVnYXRlZCIsIkRhdGE0X1N0YXRzIikNCm15RGlyLkJBU0UgPC0gZ2V0d2QoKQ0KIw0KIyBDcmVhdGUgZGF0YSBkaXJlY3Rvcmllcw0KbXlEaXIuY3JlYXRlIDwtIHBhc3RlMCgiLi8iLFNlbGVjdGlvbi5TVUJbMV0pDQogIGlmZWxzZShkaXIuZXhpc3RzKG15RGlyLmNyZWF0ZSk9PUZBTFNFLGRpci5jcmVhdGUobXlEaXIuY3JlYXRlKSwiRGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIikNCm15RGlyLmNyZWF0ZSA8LSBwYXN0ZTAoIi4vIixTZWxlY3Rpb24uU1VCWzJdKQ0KICBpZmVsc2UoZGlyLmV4aXN0cyhteURpci5jcmVhdGUpPT1GQUxTRSxkaXIuY3JlYXRlKG15RGlyLmNyZWF0ZSksIkRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyIpDQpteURpci5jcmVhdGUgPC0gcGFzdGUwKCIuLyIsU2VsZWN0aW9uLlNVQlszXSkNCiAgaWZlbHNlKGRpci5leGlzdHMobXlEaXIuY3JlYXRlKT09RkFMU0UsZGlyLmNyZWF0ZShteURpci5jcmVhdGUpLCJEaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMiKQ0KbXlEaXIuY3JlYXRlIDwtIHBhc3RlMCgiLi8iLFNlbGVjdGlvbi5TVUJbNF0pDQogIGlmZWxzZShkaXIuZXhpc3RzKG15RGlyLmNyZWF0ZSk9PUZBTFNFLGRpci5jcmVhdGUobXlEaXIuY3JlYXRlKSwiRGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIikNCiMNCiMgU2F2ZSBleGFtcGxlIGRhdGEgKGFzc3VtZXMgZGlyZWN0b3J5IC4vRGF0YTFfUkFXLyBleGlzdHMpDQpteURhdGEgPC0gZGF0YV9yYXdfdGVzdDJfQVdfMjAxMzA0MjZfMjAxMzA3MjUNCiAgd3JpdGUuY3N2KG15RGF0YSxwYXN0ZTAoIi4vIixTZWxlY3Rpb24uU1VCWzFdLCIvdGVzdDJfQVdfMjAxMzA0MjZfMjAxMzA3MjUuY3N2IikpDQpteURhdGEgPC0gZGF0YV9yYXdfdGVzdDJfQVdfMjAxMzA3MjVfMjAxMzEwMTUNCiAgd3JpdGUuY3N2KG15RGF0YSxwYXN0ZTAoIi4vIixTZWxlY3Rpb24uU1VCWzFdLCIvdGVzdDJfQVdfMjAxMzA3MjVfMjAxMzEwMTUuY3N2IikpDQpteURhdGEgPC0gZGF0YV9yYXdfdGVzdDJfQVdfMjAxNDA5MDFfMjAxNDA5MzANCiAgd3JpdGUuY3N2KG15RGF0YSxwYXN0ZTAoIi4vIixTZWxlY3Rpb24uU1VCWzFdLCIvdGVzdDJfQVdfMjAxNDA5MDFfMjAxNDA5MzAuY3N2IikpDQpteURhdGEgPC0gZGF0YV9yYXdfdGVzdDRfQVdfMjAxNjA0MThfMjAxNjA3MjYNCiAgd3JpdGUuY3N2KG15RGF0YSxwYXN0ZTAoIi4vIixTZWxlY3Rpb24uU1VCWzFdLCIvdGVzdDRfQVdfMjAxNjA0MThfMjAxNjA3MjYuY3N2IikpDQpteUZpbGUgPC0gImNvbmZpZy5UWi5DZW50cmFsLlIiDQogIGZpbGUuY29weShmaWxlLnBhdGgocGF0aC5wYWNrYWdlKCJDb250RGF0YVFDIiksImV4dGRhdGEiLG15RmlsZSkNCiAgICAgICAgICAgICxmaWxlLnBhdGgoZ2V0d2QoKSxTZWxlY3Rpb24uU1VCWzFdLG15RmlsZSkpDQpgYGANCg0KMi4gS25pdCB0aGUgdmlnbmV0dGUgaW4gdGhlIHZpZ25ldHRlIGZvbGRlciB0byBlbnN1cmUgYWxsIG9mIHRoZSBjb2RlIHdvcmtzIGFuZCANCmlzIHByb3Blcmx5IGRpc3BsYXllZC4gIFRoaXMgY2FuIHRha2UgMiB0byA1IG1pbi4NCg0KMy4gVXNlIHRoZSBjb2RlIGJlbG93IHRvICJidWlsZCIgdGhlIHZpZ25ldHRlIGFuZCB0aGVuIHVzZSBpdCBpbiB0aGUgcGtnLg0KDQpgYGB7ciBWaWduZXR0ZV9CdWlsZCwgZXZhbD1GQUxTRX0NCiMgZ2VuZXJhdGUgVmlnbmV0dGUNCmxpYnJhcnkoQ29udERhdGFRQykNCmxpYnJhcnkoZGV2dG9vbHMpDQpkZXZ0b29sczo6YnVpbGRfdmlnbmV0dGVzKCkNCg0KIyBjcmVhdGUgdmlnbmV0dGUgZm9sZGVyIGFuZCBkZWZhdWx0IGZpbGUNCiNkZXZ0b29sczo6dXNlX3ZpZ25ldHRlKCJDb250RGF0YVFDX1ZpZ25ldHRlIikNCmBgYA0KZGV2dG9vbHM6OmJ1aWxkKCkgbW9yZSB1c2VmdWwgYW5kIGJ1aWxkX3ZpZ25ldHRlcygpDQoNCiMjIENyZWF0ZSBQYWNrYWdlDQpVc2UgdGhlIGNvZGUgYmVsb3cgdG8gY3JlYXRlIHRoZSBwYWNrYWdlLiAgQXNzdW1lcyB5b3UgYXJlIGluIHRoZSBkZXZlbG9wbWVudCBwYWNrYWdlIGRpcmVjdG9yeQ0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5DQpteUxpYnJhcnkgPC0gIkNvbnREYXRhUUMiDQpkaXJfYmFzZSA8LSAiQzovVXNlcnMvRXJpay5MZXBwby9PbmVEcml2ZSAtIFRldHJhIFRlY2gsIEluYy9NeURvY3NfT25lRHJpdmUvR2l0SHViIg0Kc2V0d2QoZmlsZS5wYXRoKGRpcl9iYXNlLCBteUxpYnJhcnkpKQ0KIw0KIyBORVdTDQojIFJlbmRlciB0aGVuIENvcHkgTkVXUyBzbyBwaWNrZWQgdXAgaW4gaGVscA0Kcm1hcmtkb3duOjpyZW5kZXIoIk5FV1Mucm1kIiwgImFsbCIpDQpmaWxlLmNvcHkoIk5FV1MubWQiLCAiTkVXUyIsIG92ZXJ3cml0ZSA9IFRSVUUpDQpmaWxlLnJlbW92ZSgiTkVXUy5odG1sIikNCmZpbGUucmVtb3ZlKCJORVdTLm1kIikNCiMNCiMgTG9hZCBMaWJyYXJ5DQpsaWJyYXJ5KGRldnRvb2xzKQ0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCiMgQ3JlYXRlIFBhY2thZ2UNCiMgY3JlYXRlKG15TGlicmFyeSkNCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojIERvY3VtZW50LCBJbnN0YWxsLCBhbmQgUmVsb2FkIExpYnJhcnkNCiMjIEdlbmVyYXRlIERvY3VtZW50YXRpb24NCmRldnRvb2xzOjpkb2N1bWVudCgpDQojIyBJbnN0YWxsIE5ldyBQYWNrYWdlIChsb2NhbGx5KQ0Kc2V0d2QoIi4uIikgIyByZXR1cm4gdG8gcm9vdCBkaXJlY3RvcnkgZmlyc3QNCmRldnRvb2xzOjppbnN0YWxsKG15TGlicmFyeSwgYnVpbGRfdmlnbmV0dGVzID0gVFJVRSwgcXVpY2sgPSBGQUxTRSwgcmVsb2FkID0gVFJVRSkNCg0KIyMgUmVsb2FkIGxpYnJhcnkNCmxpYnJhcnkobXlMaWJyYXJ5LGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCiMgY2hhbmdlIHdkIGJhY2sgdG8gcGFja2FnZQ0Kc2V0d2QoZmlsZS5wYXRoKGRpcl9iYXNlLCBteUxpYnJhcnkpKQ0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCmBgYA0KDQpBZnRlciBjcmVhdGluZyB0aGUgcGFja2FnZSByZWxvYWQgaXQgYWZ0ZXIgcmVzdGFydGluZyBSIHdpdGhpbiBSU3R1ZGlvIChDdHJsICsgU2hpZnQgKyBGMTApLg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMgUmVzdGFydCBSIHdpdGhpbiBSU3R1ZGlvOiAgQ3RybCArIFNoaWZ0ICsgRjEwDQpwa2cgPC0gIkNvbnREYXRhUUMiDQpsaWJyYXJ5KHBrZywgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KaGVscChwYWNrYWdlPShwa2cpKQ0KIw0KP1BlcmlvZFN0YXRzDQojP0NvbXBTaXRlQ0RGDQo/P0NvbnREYXRhUUMNCj9mdW4uRXhwb3J0LklIQQ0KP0V4cG9ydC5TdHJlYW1UaGVybWFsICANCmBgYA0KDQpQYWNrYWdlIHdlYnNpdGUNClVzZSBwa2dkb3duIHRvIGNyZWF0ZSBzaXRlLg0KDQpodHRwczovL3d3dy5yLWJsb2dnZXJzLmNvbS90dnRoZW1lcy0xLTEtMC1pcy1vbi1jcmFuLWNyZWF0aW5nLWEtcGtnZG93bi13ZWJzaXRlLWdyYXZpdHktZmFsbHMtcGFsZXR0ZS1hbmQtbW9yZS8NCg0KYGBge3IgUGtnZG93biwgZXZhbD1GQUxTRX0NCiNsaWJyYXJ5KHBrZ2Rvd24pDQoNCnVzZXRoaXM6OnVzZV9wa2dkb3duKCkNCnBrZ2Rvd246OmJ1aWxkX3NpdGUoKQ0KDQpgYGANCg0KDQoNClRlc3Rpbmcgb2YgY29uZmlndXJhdGlvbiBhbmQgUk1EIGZpbGVzLg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCmxpYnJhcnkoQ29udERhdGFRQykNCiMgUGFyYW1ldGVycw0KU2VsZWN0aW9uLk9wZXJhdGlvbiA8LSBjKCJHZXRHYWdlRGF0YSIsIlFDUmF3IiwgIkFnZ3JlZ2F0ZSIsICJTdW1tYXJ5U3RhdHMiKQ0KU2VsZWN0aW9uLlR5cGUgICAgICA8LSBjKCJBaXIiLCJXYXRlciIsIkFXIiwiR2FnZSIsIkFXRyIsIkFHIiwiV0ciKQ0KU2VsZWN0aW9uLlNVQiA8LSBjKCJEYXRhMV9SQVciLCJEYXRhMl9RQyIsIkRhdGEzX0FnZ3JlZ2F0ZWQiLCJEYXRhNF9TdGF0cyIpDQpteURpci5CQVNFIDwtIGdldHdkKCkNCiMNCiMgQWdncmVnYXRlIERhdGENCm15RGF0YS5PcGVyYXRpb24gPC0gIkFnZ3JlZ2F0ZSIgI1NlbGVjdGlvbi5PcGVyYXRpb25bM10NCm15RGF0YS5TaXRlSUQgICAgPC0gInRlc3QyIg0KbXlEYXRhLlR5cGUgICAgICA8LSBTZWxlY3Rpb24uVHlwZVszXSAjIkFXIg0KbXlEYXRhLkRhdGVSYW5nZS5TdGFydCAgPC0gIjIwMTMtMDEtMDEiDQpteURhdGEuRGF0ZVJhbmdlLkVuZCAgICA8LSAiMjAxNC0xMi0zMSINCm15RGlyLmltcG9ydCA8LSBmaWxlLnBhdGgobXlEaXIuQkFTRSxTZWxlY3Rpb24uU1VCWzJdKSAjIkRhdGEyX1FDIg0KbXlEaXIuZXhwb3J0IDwtIGZpbGUucGF0aChteURpci5CQVNFLFNlbGVjdGlvbi5TVUJbM10pICMiRGF0YTNfQWdncmVnYXRlZCINCm15UmVwb3J0LmZvcm1hdCA8LSAiZG9jeCINCiMNCiMgc2V0IGNvbmZpZyBmaWxlIHdpdGggUk1EIGRpcmVjdG9yeSBhcyBnZXR3ZCgpDQpteUNvbmZpZyAgICAgICAgICAgIDwtIGZpbGUucGF0aChnZXR3ZCgpLFNlbGVjdGlvbi5TVUJbMl0sImNvbmZpZy5STURkaXIuUiIpDQojIHJ1biBmdW5jdGlvbg0KQ29udERhdGFRQyhteURhdGEuT3BlcmF0aW9uLCBteURhdGEuU2l0ZUlELCBteURhdGEuVHlwZSwgbXlEYXRhLkRhdGVSYW5nZS5TdGFydA0KICAgICAgICAgICAsIG15RGF0YS5EYXRlUmFuZ2UuRW5kLCBteURpci5pbXBvcnQsIG15RGlyLmV4cG9ydA0KICAgICAgICAgICAsIGZ1bi5teVJlcG9ydC5mb3JtYXQ9bXlSZXBvcnQuZm9ybWF0LCBmdW4ubXlDb25maWcgPSBteUNvbmZpZykNCmBgYA0KDQoNCiMjIEluY2x1ZGluZyBEYXRhDQpBbGwgZGF0YSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gY3JlYXRlZC4NCg0KIyMgQ2hlY2sNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojIENoZWNrIGZvciBlcnJvcnMgKG9yIHByZXNzIENtZCArIFNoaWZ0ICsgRSBpbiBSU3R1ZGlvKQ0KI2h0dHA6Ly9yLXBrZ3MuaGFkLmNvLm56L2NoZWNrLmh0bWwNCmRldnRvb2xzOjpjaGVjaygpDQpgYGANCg0KSWYgdXNlIFJTdHVkaW8sIEJ1aWxkIC0gQ2hlY2sgUGFja2FnZSwgdGhlIG91dHB1dCBpcyBlYXNpZXIgdG8gcmVhZC4gDQoNCiMjIFRlc3QNCk5lZWQgdG8gdXNlIHRlc3R0aGF0IGJ1dCBub3QgdG8gdGhhdCBzdGFnZSB5ZXQuDQoNClJTdHVkaW8sIEJ1aWxkIC0gVGVzdCBQYWNrYWdlLg0KDQojIENJLCBCYWRnZXMsIENvZGUgQ292ZXJhZ2UsIGV0Yw0KKiBDb250aW51b3VzIEludGVncmF0aW9uIHdpdGggR2l0SHViIEFjdGlvbnMgKFRyYXZpc0NJIHNodXQgZG93biBEZWMgMjAyMCkNCiogQ29kZSBRdWFsaXR5IChDb2RlRmFjdG9yKQ0KICAgICsgQ29kZUZhY3Rvci5pbw0KICAgICAgICAtIEdpdEh1YiBsb2dpbg0KKiBDb2RlIENvdmVyYWdlICh0ZXN0aW5nKQ0KICAgICsgQ29kZWNvdi5pbw0KICAgICAgICAtIEdpdEh1YiBsb2dpbg0KICAgICAgICAtIEFmdGVyIHNldCB1cCBDSSB3aXRoIEdpdEh1YiBBY3Rpb25zDQoqIFBhY2thZ2Ugd2Vic2l0ZSAocGtnZG93biBhbmQgR2l0SHViIEFjdGlvbikNCiAgICArIGJyYW5jaCBnaC1wYWdlcywgYXV0byB1cGRhdGVzIHdpdGggZWFjaCBjb21taXQNCiAgICArIFVwZGF0ZSBpbiBzZXR0aW5ncyB0aGUgbG9jYXRpb24NCiogQmFkZ2VzOyBNYWludGFpbmVkLCBMaWZlIEN5Y2xlLCBMaWNlbnNlLCBJc3N1ZXMsIGV0Yw0KICAgICsgaHR0cHM6Ly9naXRodWIuY29tL0d1YW5nY2h1YW5nWXUvYmFkZ2VyDQogICAgICAgIC0gQ29tbWFuZHMgdG8gY3JlYXRlIGJhZGdlcw0KDQpiYWRnZXIgcGFja2FnZSBjcmVhdGVzIHRoZSB0ZXh0IGZvciBwa2cgcmVhZG1lIGZpbGUuDQogICAgICAgIA0KQWxzbw0KaHR0cHM6Ly9zaGllbGRzLmlvLyAgICAgICAgDQpodHRwczovL2dpdGh1Yi5jb20vYmFkZ2VzL3NoaWVsZHMNCkNhbiBtYWtlIHNvbWUgYmFkZ2VzIGR5bmFtaWMsIHN0YXRpYyBvbmVzIGJlbG93DQoNCiMgaXNzdWVzDQpbIVtHaXRIdWIgaXNzdWVzXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9pc3N1ZXMvbGVwcG90dC9NQlNTdG9vbHMuc3ZnKV0oaHR0cHM6Ly9HaXRIdWIuY29tL2xlcHBvdHQvTUJTU3Rvb2xzL2lzc3Vlcy8pDQojIHJlbGVhc2UNClshW0dpdEh1YiByZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9yZWxlYXNlL2xlcHBvdHQvTUJTU3Rvb2xzLnN2ZyldKGh0dHBzOi8vR2l0SHViLmNvbS9sZXBwb3R0L01CU1N0b29scy9yZWxlYXNlcy8pDQojIGRvd25sb2Fkcw0KWyFbR2l0aHViIGFsbCByZWxlYXNlc10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvZG93bmxvYWRzL2xlcHBvdHQvTUJTU3Rvb2xzL3RvdGFsLnN2ZyldKGh0dHBzOi8vR2l0SHViLmNvbS9sZXBwb3R0L01CU1N0b29scy9yZWxlYXNlcy8pDQogICAgICAgIA0KYGBge3J9DQpwa2dfR0ggPC0gImxlcHBvdHQvQ29udERhdGFRQyINCnBrZ19saWMgPC0gIk1JVCINCg0KIyBHaXRIdWIgQWN0aW9uLCBDSQ0KdXNldGhpczo6dXNlX2dpdGh1Yl9hY3Rpb25zKCkNCnVzZXRoaXM6OnVzZV9naXRodWJfYWN0aW9uc19iYWRnZSgpDQojIGJhZGdlcjo6YmFkZ2VfZ2l0aHViX2FjdGlvbnMocGtnX0dIKQ0KDQojIGNvZGUgY292ZXJhZ2UNCnVzZXRoaXM6OnVzZV9naXRodWJfYWN0aW9uKCJ0ZXN0LWNvdmVyYWdlIikNCg0KIyBHaXRIdWIgQWN0aW9uLCBwa2dkb3duDQp1c2V0aGlzOjp1c2VfZ2l0aHViX2FjdGlvbigicGtnZG93biIpDQoNCiMgQmFkZ2VzDQojIGxpZmVjeWNsZQ0KYmFkZ2VyOjpiYWRnZV9saWZlY3ljbGUoInN0YWJsZSIsICJncmVlbiIpICMgc3RhYmxlL2dyZWVuLCBtYXR1cmluZy9kb3JtYW50L2JsdWUNCiMgbWFpbnRhaW5lZA0KIyBsaWNlbnNlDQpiYWRnZXI6OmJhZGdlX2xpY2Vuc2UocGtnX2xpYykNCiMgY29kZSBxdWFsaXR5DQpiYWRnZXI6OmJhZGdlX2NvZGVmYWN0b3IocGtnX0dIKQ0KIyBjb2RlIHRlc3RpbmcgY292ZXJhZ2UNCmJhZGdlcjo6YmFkZ2VfY29kZWNvdihwa2dfR0gpDQojIGNtZCBjaGVjaw0KYmFkZ2VyOjpiYWRnZV9naXRodWJfYWN0aW9ucyhwa2dfR0gpDQoNCg0KYGBgDQoNCg0KDQojIE90aGVyIFN0dWZmDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCiMgVXBsb2FkIHRvIEdpdGh1YiB2aWEgR2l0SHViIERlc2t0b3AgdXRpbGl0eQ0KIyAwLiBkb3dubG9hZCBmcm9tIHdlYiB2aWEgImNsb25lIG9yIGRvd25sb2FkIiB2aWEgIk9wZW4gaW4gRGVza3RvcCIgKEdpdEh1YiBEZXNrdG9wKSBpZiBub3QgYWxyZWFkeSBpbiBHaXRIdWIgRGVza3RvcA0KIyAxLiBNYWtlIGNoYW5nZXMgaW4gZG93bmxvYWQvY2xvbmUgZm9sZGVyLiAoZG9uZSBhYm92ZSkNCiMgMy4gT3BlbiBHSCBEZXNrdG9wIGNvbW1pdCBjaGFuZ2VzIHRoZW4gc3luYy4NCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojIGluc3RhbGwgZnJvbSBHaXRIdWIgKHZpYSBkZXZ0b29scykNCm15TGlicmFyeSA8LSAiQ29udERhdGFRQyINCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YihwYXN0ZTAoImxlcHBvdHQvIixteUxpYnJhcnkpKQ0KIw0KDQoNCg0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCiMgcmVtb3ZlIGluc3RhbGxlZCBwYWNrYWdlcyAoaWYgbmVlZGVkIGZvciB0cm91Ymxlc2hvb3RpbmcpDQpzZWFyY2goKSAjIGZpbmQNCiNkZXRhY2goMykgIyByZW1vdmUgYnkgbnVtYmVyDQojfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fg0KDQoNCiMgdG8gYnVpbGQgcGFja2FnZQ0KI2h0dHBzOi8vdGhlcG9saXRpY2FsbWV0aG9kb2xvZ2lzdC5jb20vMjAxNC8wOC8xNC9idWlsZGluZy1hbmQtbWFpbnRhaW5pbmctci1wYWNrYWdlcy13aXRoLWRldnRvb2xzLWFuZC1yb3h5Z2VuMi8NCiMgVG8gYnVpbGQgdGhlIHBhY2thZ2UgYXMgYSBjb21wcmVzc2VkIGZpbGUgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeSwgcnVuIGJ1aWxkKGN1cnJlbnQuY29kZSwgcGF0aD1nZXR3ZCgpKS4NCg0KIyB0byBzYXZlIGludGVybmFsIGRhdGEgZm9yIGV4YW1wbGVzDQojIGV4YW1wbGUNCiNodHRwOi8vci1wa2dzLmhhZC5jby5uei9kYXRhLmh0bWwjZGF0YS1zeXNkYXRhDQojIGhhdmUgdG8gYmUgYXQgcm9vdCBkaXJlY3RvcnkgKGFib3ZlIHBhY2thZ2UpDQojZGV2dG9vbHM6OnVzZV9kYXRhKE5WLnByZWRpY3RvcnMsTlYuYnVncyxwa2c9Ik1NSWNhbGNOViIsaW50ZXJuYWw9VFJVRSxvdmVyd3JpdGU9VFJVRSkNCiMjIHZlcmlmeSB3aXRoIGRhdGEoKQ0KDQojIFRvIHNhdmUgUk1EIGZpbGVzDQojIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzAzNzcyMTMvaG93LXRvLWluY2x1ZGUtcm1hcmtkb3duLWZpbGUtaW4tci1wYWNrYWdlDQojIC9wa2cvaW5zdC9ybWQvDQojIHN5c3RlbS5maWxlKCJybWQvZmlsZS5SbWQiLCBwYWNrYWdlPSJwYWNrYWdlbmFtZSIpDQojDQojfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fg0KI2h0dHBzOi8vaGlsYXJ5cGFya2VyLmNvbS8yMDE0LzA0LzI5L3dyaXRpbmctYW4tci1wYWNrYWdlLWZyb20tc2NyYXRjaC8NCiMgQ3JlYXRlIFBhY2thZ2UNCiMgY3JlYXRlKG15TGlicmFyeSkNCg0KYGBgDQoNCiMgVGVzdCBTdGF0cyBvbmx5DQoNCg0KYGBge3IgU3RhdHNfR2FnZSwgZXZhbD1GQUxTRX0NCiMgUGFyYW1ldGVycw0KU2VsZWN0aW9uLk9wZXJhdGlvbiA8LSBjKCJHZXRHYWdlRGF0YSIsIlFDUmF3IiwgIkFnZ3JlZ2F0ZSIsICJTdW1tYXJ5U3RhdHMiKQ0KU2VsZWN0aW9uLlR5cGUgICAgICA8LSBjKCJBaXIiLCJXYXRlciIsIkFXIiwiR2FnZSIsIkFXRyIsIkFHIiwiV0ciKQ0KU2VsZWN0aW9uLlNVQiA8LSBjKCJEYXRhMV9SQVciLCJEYXRhMl9RQyIsIkRhdGEzX0FnZ3JlZ2F0ZWQiLCJEYXRhNF9TdGF0cyIpDQpteURpci5CQVNFIDwtIGdldHdkKCkNCiMNCiMgU3VtbWFyeSBTdGF0cywgRmlsZQ0KIyMgSGF2ZSB0byB1c2UgImZpbGUiIHZlcnNpb24uICANCiMjIEJhc2UgdmVyc2lvbiBidWlsZHMgZmlsZSBuYW1lIGFuZCBleHBlY3RzICJEQVRBIiBwcmVmaXgNCg0KIyBHYWdlIEZpbGUgKyBPdGhlciBGaWxlDQpteURhdGEuT3BlcmF0aW9uIDwtICJTdW1tYXJ5U3RhdHMiICNTZWxlY3Rpb24uT3BlcmF0aW9uWzRdDQpteUZpbGUgPC0gYygiRGF0YTRTdGF0c18wMTE4NzMwMF9HYWdlXzIwMTMwMTAxXzIwMTQxMjMxLmNzdiINCiAgICAgICAgICAgICwiRGF0YTRTdGF0c190ZXN0Ml9Bd18yMDEzMDEwMV8yMDE0MTIzMS5jc3YiKQ0KbXlEaXIuaW1wb3J0IDwtIGZpbGUucGF0aCgiLiIsImRhdGEtcmF3IikNCm15RGlyLmV4cG9ydCA8LSBmaWxlLnBhdGgoIi4iLCJEYXRhNF9TdGF0cyIpDQoNCiNMZWF2ZSBvZmYgbXlSZXBvcnQuZm9ybWF0IGFuZCBnZXQgZGVmYXVsdCAoZG9jeCkuDQpDb250RGF0YVFDKG15RGF0YS5PcGVyYXRpb24NCiAgICAgICAgICAgLCBmdW4ubXlEaXIuaW1wb3J0PW15RGlyLmltcG9ydA0KICAgICAgICAgICAsIGZ1bi5teURpci5leHBvcnQ9bXlEaXIuZXhwb3J0DQogICAgICAgICAgICwgZnVuLm15RmlsZT1teUZpbGUpDQoNCg0KYGBgDQoNClNpdGVJRCwgRGF0ZSwgVGltZSwgRGF0ZS5UaW1lLCBQYXJhbWV0ZXJzLCBGbGFnLlBhcmFtZXRlcnMNCg0KT25seSBvbmUgZmxhZyBwZXIgcGFyYW1ldGVyLiAgRG8gbm90IG5lZWQgaW5kaXZpZHVhbCB0ZXN0IGZsYWdzLg0KDQoiRiIgKGZhaWwpIGZsYWdzIGFyZSBjaGFuZ2VkIHRvIE5BIHNvIHRoZXkgYXJlIGRyb3BwZWQgZnJvbSB0aGUgc3RhdGlzdGljcyB0aGF0IGNhbGN1bGF0ZWQuDQoNCk1vY2tlZCB1cCAyIGZpbGVzLg0K