1 Introduction

This assignment looks at the conceptual understanding of decomposing time series and forecasting with decomposing. We want to enhance our conceptual understanding of methods of decomposition and forecasting. Also want to find the appropriate training size to produce the best performance.

1.1 Data Description

  • Month- Month of the year (in numbers. Ex: 1-Jan, 2-Feb…)
  • Year- The year it was
  • LowTemp- Lowest temperature
  • HighTemp- Highest temperature
  • WarmestMin- The lowest warm temperature
  • ColdestHigh- The highest cold temperature
  • AveMin-The average minimum temperature
  • AveMax- The average maximum temperature
  • meanTemp- The mean temperature
  • TotPrecip- The total precipitation
  • TotSnow- The total snow
  • Max24hrPrecip- The maximum amount of precipitation in 24 hours

2 Define time series object

Since this is monthly data, frequency =12 will be used the define the time series object.

US bond monthly rates

US bond monthly rates

2.1 Forecasting with Decomposing

The following visual representations show the different behaviors of the two methods of decomposition.

Classical decomposition of additive time series

Classical decomposition of additive time series

STL decomposition of additive time series

STL decomposition of additive time series

The second model seems to be better at visualizing the trends of the data. Looking at the decomposition visuals we can see that there is a maximum around 2015 and a minimum around 2018. Looking at the graphs both look easy to interpret but the second one has a more simple approach to showing you the trend. The second decomposing model has a more smooth way of showing us the data compared to the first.

We next perform error analysis.

Error comparison between forecast results with different sample sizes
MSE MAPE
n.144 0.1555844 0.0001788
n.109 0.1603712 0.0001822
n. 73 0.1732466 0.0001917
n. 48 0.1981214 0.0002088

Now we can see the values for the MSE and MAPE. We used the same algorithm with 4 different sample sizes and compared the resulting accuracy measures. The sample size of 144 gives the lowest MSE and lowest MAPE. This means that it is the best model due to its lower error. It seems like the n=144 model outperforms the rest of the models. We are confident that the larger sample size (n=144) will be a good representative of the data. We do not have any concerns of things like over fitting since we have a large sample size.

3 Conclusion

We just showed the initial time series, the decomposition of the time series, and the error analysis. We concluded which graph we thought was better and then talked about the best value for n that gave us the lowest error which was n=144.

LS0tCnRpdGxlOiAiU2VhdHRsZSBXZWF0aGVyIFRpbWUgU2VyaWVzIgphdXRob3I6ICJSeWFuIExlYm8iCmRhdGU6ICIyMDI0LTExLTI3IgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwogICAgZmlnX3dpZHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdG9jX2NvbGxhcHNlZDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgc21vb3RoX3Njcm9sbDogeWVzCiAgICB0aGVtZTogbHVtZW4KICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAga2VlcF9tZDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIGZpZ193aWR0aDogMwogICAgZmlnX2hlaWdodDogMwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCnNsd2F5c19hbGxvd19odG1sOiB0cnVlCi0tLQoKYGBgez1odG1sfQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLwoKaDEudGl0bGUgeyAgLyogVGl0bGUgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIHRoZSByZXBvcnQgdGl0bGUgKi8KICBmb250LXNpemU6IDI0cHg7CiAgY29sb3I6IERhcmtSZWQ7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsKfQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovCiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7CiAgY29sb3I6IERhcmtSZWQ7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9Cmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBkYXRlICAqLwogIGZvbnQtc2l6ZTogMThweDsKICBmb250LWZhbWlseTogc3lzdGVtLXVpOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8KICAgIGZvbnQtc2l6ZTogMjJweDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDIgeyAvKiBIZWFkZXIgMiAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDIgc2VjdGlvbiB0aXRsZSAqLwogICAgZm9udC1zaXplOiAyMHB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogbmF2eTsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8KICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoNCB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCA0IHNlY3Rpb24gdGl0bGUgICovCiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBkYXJrcmVkOwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0KCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9CgpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQoKPC9zdHlsZT4KYGBgCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIERldGVjdCwgaW5zdGFsbCwgYW5kIGxvYWQgcGFja2FnZXMgaWYgbmVlZGVkLgppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQogICBsaWJyYXJ5KGtuaXRyKQp9CmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZXQiKQogICBsaWJyYXJ5KGxlYWZsZXQpCn0KaWYgKCFyZXF1aXJlKCJFbnZTdGF0cyIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoIkVudlN0YXRzIikKICAgbGlicmFyeShFbnZTdGF0cykKfQppZiAoIXJlcXVpcmUoIk1BU1MiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJNQVNTIikKICAgbGlicmFyeShNQVNTKQp9CmlmICghcmVxdWlyZSgicGh5dG9vbHMiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJwaHl0b29scyIpCiAgIGxpYnJhcnkocGh5dG9vbHMpCn0KaWYgKCFyZXF1aXJlKCJtbGJlbmNoIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygibWxiZW5jaCIpCiAgIGxpYnJhcnkobWxiZW5jaCkKfQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpCiAgIGxpYnJhcnkocGFuZGVyKQp9CmlmICghcmVxdWlyZSgiSVN3UiIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoIklTd1IiKQogICBsaWJyYXJ5KElTd1IpCn0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpCiAgIGxpYnJhcnkoZ2dwbG90MikKfQppZiAoIXJlcXVpcmUoImZvcmVjYXN0IikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiZm9yZWNhc3QiKQogICBsaWJyYXJ5KGZvcmVjYXN0KQp9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsICAKICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICAKICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgCiAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gRkFMU0UgICAKICAgICAgICAgICAgICAgICAgICAgICkgICAKYGBgCgpgYGB7cn0Kc193ZWF0aCA8LSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1J5YW5MZWJvL1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL3NlYXR0bGVfd2VhdGhlci5jc3YiLCBoZWFkZXIgPSBUUlVFKQpuLnJvdyA9IGRpbShzX3dlYXRoKVsxXQpkYXRhLnNlYS53ZWF0aCA9IHNfd2VhdGhbKG4ucm93LTE1MCk6bi5yb3csIF0KYGBgCgojIEludHJvZHVjdGlvbgpUaGlzIGFzc2lnbm1lbnQgbG9va3MgYXQgdGhlIGNvbmNlcHR1YWwgdW5kZXJzdGFuZGluZyBvZiBkZWNvbXBvc2luZyB0aW1lIHNlcmllcyBhbmQgZm9yZWNhc3Rpbmcgd2l0aCBkZWNvbXBvc2luZy4gV2Ugd2FudCB0byBlbmhhbmNlIG91ciBjb25jZXB0dWFsIHVuZGVyc3RhbmRpbmcgb2YgbWV0aG9kcyBvZiBkZWNvbXBvc2l0aW9uIGFuZCBmb3JlY2FzdGluZy4gQWxzbyB3YW50IHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIHRyYWluaW5nIHNpemUgdG8gcHJvZHVjZSB0aGUgYmVzdCBwZXJmb3JtYW5jZS4KCiMjIERhdGEgRGVzY3JpcHRpb24KCiogTW9udGgtIE1vbnRoIG9mIHRoZSB5ZWFyIChpbiBudW1iZXJzLiBFeDogMS1KYW4sIDItRmViLi4uKQoqIFllYXItIFRoZSB5ZWFyIGl0IHdhcwoqIExvd1RlbXAtIExvd2VzdCB0ZW1wZXJhdHVyZSAKKiBIaWdoVGVtcC0gSGlnaGVzdCB0ZW1wZXJhdHVyZSAKKiBXYXJtZXN0TWluLSBUaGUgbG93ZXN0IHdhcm0gdGVtcGVyYXR1cmUgCiogQ29sZGVzdEhpZ2gtIFRoZSBoaWdoZXN0IGNvbGQgdGVtcGVyYXR1cmUgCiogQXZlTWluLVRoZSBhdmVyYWdlIG1pbmltdW0gdGVtcGVyYXR1cmUKKiBBdmVNYXgtIFRoZSBhdmVyYWdlIG1heGltdW0gdGVtcGVyYXR1cmUKKiBtZWFuVGVtcC0gVGhlIG1lYW4gdGVtcGVyYXR1cmUKKiBUb3RQcmVjaXAtIFRoZSB0b3RhbCBwcmVjaXBpdGF0aW9uCiogVG90U25vdy0gVGhlIHRvdGFsIHNub3cKKiBNYXgyNGhyUHJlY2lwLSBUaGUgbWF4aW11bSBhbW91bnQgb2YgcHJlY2lwaXRhdGlvbiBpbiAyNCBob3VycwoKCiMgRGVmaW5lIHRpbWUgc2VyaWVzIG9iamVjdAoKU2luY2UgdGhpcyBpcyBtb250aGx5IGRhdGEsIGZyZXF1ZW5jeSA9MTIgd2lsbCBiZSB1c2VkIHRoZSBkZWZpbmUgdGhlIHRpbWUgc2VyaWVzIG9iamVjdC4KCmBgYHtyICBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PSAzLCBmaWcuY2FwPSJVUyBib25kIG1vbnRobHkgcmF0ZXMifQpzZWF3ZWF0aC50cyA9IHRzKGRhdGEuc2VhLndlYXRoWyw5XSwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDA4LCAxKSkKcGFyKG1hcj1jKDIsMiwyLDIpKQpwbG90KHNlYXdlYXRoLnRzLCBtYWluPSJTZWF0dGxlIE1vbnRobHkgTWVhbiBUZW1wZXJhdHVyZSAiLCB5bGFiPSJNZWFuVGVtcCIsIHhsYWI9InllYXIiKQpgYGAKCiMjIEZvcmVjYXN0aW5nIHdpdGggRGVjb21wb3NpbmcKClRoZSBmb2xsb3dpbmcgdmlzdWFsIHJlcHJlc2VudGF0aW9ucyBzaG93IHRoZSBkaWZmZXJlbnQgYmVoYXZpb3JzIG9mIHRoZSB0d28gbWV0aG9kcyBvZiBkZWNvbXBvc2l0aW9uLgoKYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuY2FwPSAiQ2xhc3NpY2FsIGRlY29tcG9zaXRpb24gb2YgYWRkaXRpdmUgdGltZSBzZXJpZXMiLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD00fQpzZWEuZGVjb21wID0gZGVjb21wb3NlKHNlYXdlYXRoLnRzKQpwYXIobWFyPWMoMiwyLDIsMikpCnBsb3Qoc2VhLmRlY29tcCwgeGxhYj0iIikKYGBgCgoKCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0gIlNUTCBkZWNvbXBvc2l0aW9uIG9mIGFkZGl0aXZlIHRpbWUgc2VyaWVzIiwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NH0Kc2VhMi5kZWNvbXA9c3RsKHNlYXdlYXRoLnRzLCBzLndpbmRvdyA9IDEyKQpwYXIobWFyPWMoMiwyLDIsMikpCnBsb3Qoc2VhMi5kZWNvbXApCmBgYAoKVGhlIHNlY29uZCBtb2RlbCBzZWVtcyB0byBiZSBiZXR0ZXIgYXQgdmlzdWFsaXppbmcgdGhlIHRyZW5kcyBvZiB0aGUgZGF0YS4gTG9va2luZyBhdCB0aGUgZGVjb21wb3NpdGlvbiB2aXN1YWxzIHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gYXJvdW5kIDIwMTUgYW5kIGEgbWluaW11bSBhcm91bmQgMjAxOC4gTG9va2luZyBhdCB0aGUgZ3JhcGhzIGJvdGggbG9vayBlYXN5IHRvIGludGVycHJldCBidXQgdGhlIHNlY29uZCBvbmUgaGFzIGEgbW9yZSBzaW1wbGUgYXBwcm9hY2ggdG8gc2hvd2luZyB5b3UgdGhlIHRyZW5kLiBUaGUgc2Vjb25kIGRlY29tcG9zaW5nIG1vZGVsIGhhcyBhIG1vcmUgc21vb3RoIHdheSBvZiBzaG93aW5nIHVzIHRoZSBkYXRhIGNvbXBhcmVkIHRvIHRoZSBmaXJzdC4gCgoKYGBge3J9CmluaS5kYXRhID0gZGF0YS5zZWEud2VhdGhbLDJdCm4wID0gbGVuZ3RoKGluaS5kYXRhKQojIwp0cmFpbi5kYXRhMDEgPSBkYXRhLnNlYS53ZWF0aFsxOihuMC03KSwgMl0KdHJhaW4uZGF0YTAyID0gZGF0YS5zZWEud2VhdGhbMzc6KG4wLTcpLCAyXQp0cmFpbi5kYXRhMDMgPSBkYXRhLnNlYS53ZWF0aFs3MzoobjAtNyksIDJdCnRyYWluLmRhdGEwNCA9IGRhdGEuc2VhLndlYXRoWzk3OihuMC03KSwgMl0KIyMgbGFzdCA3IG9ic2VydmF0aW9ucwp0ZXN0LmRhdGEgPSBkYXRhLnNlYS53ZWF0aFsobjAtNik6bjAsMl0KIyMKdHJhaW4wMS50cyA9IHRzKHRyYWluLmRhdGEwMSwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDA4LCAxKSkKdHJhaW4wMi50cyA9IHRzKHRyYWluLmRhdGEwMiwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDExLCAxKSkKdHJhaW4wMy50cyA9IHRzKHRyYWluLmRhdGEwMywgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDE0LCAxKSkKdHJhaW4wNC50cyA9IHRzKHRyYWluLmRhdGEwNCwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDE2LCAxKSkKIyMKc3RsMDEgPSBzdGwodHJhaW4wMS50cywgcy53aW5kb3cgPSAxMikKc3RsMDIgPSBzdGwodHJhaW4wMi50cywgcy53aW5kb3cgPSAxMikKc3RsMDMgPSBzdGwodHJhaW4wMy50cywgcy53aW5kb3cgPSAxMikKc3RsMDQgPSBzdGwodHJhaW4wNC50cywgcy53aW5kb3cgPSAxMikKIyMgRm9yZWNhc3Qgd2l0aCBkZWNvbXBvc2luZwpmY3N0MDEgPSBmb3JlY2FzdChzdGwwMSxoPTcsIG1ldGhvZD0ibmFpdmUiKQpmY3N0MDIgPSBmb3JlY2FzdChzdGwwMixoPTcsIG1ldGhvZD0ibmFpdmUiKQpmY3N0MDMgPSBmb3JlY2FzdChzdGwwMyxoPTcsIG1ldGhvZD0ibmFpdmUiKQpmY3N0MDQgPSBmb3JlY2FzdChzdGwwNCxoPTcsIG1ldGhvZD0ibmFpdmUiKQpgYGAKCldlIG5leHQgcGVyZm9ybSBlcnJvciBhbmFseXNpcy4KCmBgYHtyfQojIyBUbyBjb21wYXJlIGRpZmZlcmVudCBlcnJvcnMsIHdlIHdpbGwgbm90IHVzZSB0aGUgcGVyY2VudGFnZSBmb3IgTUFQRQpQRTAxPSh0ZXN0LmRhdGEtZmNzdDAxJG1lYW4pL2Zjc3QwMSRtZWFuClBFMDI9KHRlc3QuZGF0YS1mY3N0MDIkbWVhbikvZmNzdDAyJG1lYW4KUEUwMz0odGVzdC5kYXRhLWZjc3QwMyRtZWFuKS9mY3N0MDMkbWVhbgpQRTA0PSh0ZXN0LmRhdGEtZmNzdDA0JG1lYW4pL2Zjc3QwNCRtZWFuCiMjIwpNQVBFMSA9IG1lYW4oYWJzKFBFMDEpKQpNQVBFMiA9IG1lYW4oYWJzKFBFMDIpKQpNQVBFMyA9IG1lYW4oYWJzKFBFMDMpKQpNQVBFNCA9IG1lYW4oYWJzKFBFMDQpKQojIyMKRTE9dGVzdC5kYXRhLWZjc3QwMSRtZWFuCkUyPXRlc3QuZGF0YS1mY3N0MDIkbWVhbgpFMz10ZXN0LmRhdGEtZmNzdDAzJG1lYW4KRTQ9dGVzdC5kYXRhLWZjc3QwNCRtZWFuCiMjCk1TRTE9bWVhbihFMV4yKQpNU0UyPW1lYW4oRTJeMikKTVNFMz1tZWFuKEUzXjIpCk1TRTQ9bWVhbihFNF4yKQojIyMKTVNFPWMoTVNFMSwgTVNFMiwgTVNFMywgTVNFNCkKTUFQRT1jKE1BUEUxLCBNQVBFMiwgTUFQRTMsIE1BUEU0KQphY2N1cmFjeT1jYmluZChNU0U9TVNFLCBNQVBFPU1BUEUpCnJvdy5uYW1lcyhhY2N1cmFjeSk9Yygibi4xNDQiLCAibi4xMDkiLCAibi4gNzMiLCAibi4gNDgiKQprYWJsZShhY2N1cmFjeSwgY2FwdGlvbj0iRXJyb3IgY29tcGFyaXNvbiBiZXR3ZWVuIGZvcmVjYXN0IHJlc3VsdHMgd2l0aCBkaWZmZXJlbnQgc2FtcGxlIHNpemVzIikKYGBgCgoKCmBgYHtyfQpwYXIobWZyb3c9YygxLDIpKQpwbG90KDE6NCwgTVNFLCB0eXBlPSJiIiwgY29sPSJkYXJrcmVkIiwgeWxhYj0iRXJyb3IiLCB4bGFiPSIiLAogICAKICAgICBtYWluPSJNU0UiLCBheGVzPUZBTFNFKQpsYWJzPWMoIm49MTQ0IiwgIm49MTA5IiwgIm49NzMiLCAibj00OCIpCmF4aXMoMSwgYXQ9MTo0LCBsYWJlbD1sYWJzKQpheGlzKDIpCgp0ZXh0KDE6NCwgTUFQRSswLjAzLCBhcy5jaGFyYWN0ZXIocm91bmQoTUFQRSw0KSksIGNvbD0iYmx1ZSIsIGNleD0wLjcpCnRleHQoMTo0LCBNU0UtMC4wMywgYXMuY2hhcmFjdGVyKHJvdW5kKE1TRSw0KSksIGNvbD0iZGFya3JlZCIsIGNleD0wLjcpCmxlZ2VuZCgxLjUsIDAuNjMsIGMoIk1TRSIsICJNQVBFIiksIGNvbD1jKCJkYXJrcmVkIiwiYmx1ZSIpLCBsdHk9MSwgYnR5PSJuIiwgY2V4PTAuNykKCnBsb3QoMTo0LCBNQVBFLCB0eXBlPSJiIiwgY29sPSJkYXJrcmVkIiwgeWxhYj0iRXJyb3IiLCB4bGFiPSIiLAogIAogICAgIG1haW49Ik1BUEUiLCBheGVzPUZBTFNFKQpsYWJzPWMoIm49MTQ0IiwgIm49MTA5IiwgIm49NzMiLCAibj00OCIpCmF4aXMoMSwgYXQ9MTo0LCBsYWJlbD1sYWJzKQpheGlzKDIpCgpgYGAKCk5vdyB3ZSBjYW4gc2VlIHRoZSB2YWx1ZXMgZm9yIHRoZSBNU0UgYW5kIE1BUEUuIFdlIHVzZWQgdGhlIHNhbWUgYWxnb3JpdGhtIHdpdGggNCBkaWZmZXJlbnQgc2FtcGxlIHNpemVzIGFuZCBjb21wYXJlZCB0aGUgcmVzdWx0aW5nIGFjY3VyYWN5IG1lYXN1cmVzLiBUaGUgc2FtcGxlIHNpemUgb2YgMTQ0IGdpdmVzIHRoZSBsb3dlc3QgTVNFIGFuZCBsb3dlc3QgTUFQRS4gVGhpcyBtZWFucyB0aGF0IGl0IGlzIHRoZSBiZXN0IG1vZGVsIGR1ZSB0byBpdHMgbG93ZXIgZXJyb3IuIEl0IHNlZW1zIGxpa2UgdGhlIG49MTQ0IG1vZGVsIG91dHBlcmZvcm1zIHRoZSByZXN0IG9mIHRoZSBtb2RlbHMuIFdlIGFyZSBjb25maWRlbnQgdGhhdCB0aGUgbGFyZ2VyIHNhbXBsZSBzaXplIChuPTE0NCkgd2lsbCBiZSBhIGdvb2QgcmVwcmVzZW50YXRpdmUgb2YgdGhlIGRhdGEuIFdlIGRvIG5vdCBoYXZlIGFueSBjb25jZXJucyBvZiB0aGluZ3MgbGlrZSBvdmVyIGZpdHRpbmcgc2luY2Ugd2UgaGF2ZSBhIGxhcmdlIHNhbXBsZSBzaXplLgoKIyBDb25jbHVzaW9uCgpXZSBqdXN0IHNob3dlZCB0aGUgaW5pdGlhbCB0aW1lIHNlcmllcywgdGhlIGRlY29tcG9zaXRpb24gb2YgdGhlIHRpbWUgc2VyaWVzLCBhbmQgdGhlIGVycm9yIGFuYWx5c2lzLiBXZSBjb25jbHVkZWQgd2hpY2ggZ3JhcGggd2UgdGhvdWdodCB3YXMgYmV0dGVyIGFuZCB0aGVuIHRhbGtlZCBhYm91dCB0aGUgYmVzdCB2YWx1ZSBmb3IgbiB0aGF0IGdhdmUgdXMgdGhlIGxvd2VzdCBlcnJvciB3aGljaCB3YXMgbj0xNDQuCgoKCgo=