Diffusion Index and graph in via a ggplot
Three US economic variables were used to produce the Diffusion Index
for the US economy: the unemployment rate (UNRATE), the average hourly
earnings of all employees (CES0500000003), and • CPIAUCSL, or the
Consumer Price Index for All Urban Consumers
To enable straightforward interpretation, the data is then condensed
for the years 2010–2024 at monthly intervals.
To gauge the changes over time, the initial differences were computed
for every series. After that, the variations were transformed into up
(1), down (-1), or no change (0). This conversion aids in trend analysis
and Diffusion Index computation.
The following formula was used to determine the Diffusion Index:
Diffusion Index=(Positives/Total−Negatives/Total) In order to improve
interpretability, we scaled the time series of monthly Diffusion Index
values from -1 to 1 to -100 to 100.

The graph displays multiple economic performance cycles.
For example, there are times when the index stays positive for a long
time, which denotes steady economic expansion.
Long stretches below zero, on the other hand, indicate protracted
economic downturns.
Significant changes in policy or the economy may be reflected in
large index spikes or dips.
2010–2012: The years after the 2008 financial crisis, probably
indicating a recovery.
2013–2015: Stable economic expansion periods.
2020: A notable decline that may have been brought on by the COVID-19
pandemic.
2021–2023: Post-pandemic economic rebound.
Diffusion Index and graph in via a ggplot with a built in smoother or
you create the smoother.

The Smoother represents the time frame.
2010–2012: During this time, values are rising and remaining
positive, indicating a recovery phase from the 2008 financial
crisis.
2013–2015: Stable economic conditions are shown by relative
stability, with less variation around the zero line.
2020: A steep drop that most likely reflects the COVID-19 pandemic’s
economic effects.
2021–2023: A period of recovery during which the index resumes its
upward trajectory.
Here, the Smoother Line averages out short-term volatility to help
visualize the underlying trend.
Additionally, the confidence interval is indicated by the gray shaded
area, which displays the range that the actual trend most likely lies
within. Greater confidence in the trend estimate is indicated by a
narrower band.
Chicago Fed National Activity Index: Diffusion Index (CFNAIDIFF)

After that, I added a smoother to the data for the Chicago Fed
National Activity Index: Diffusion Index over the same time frame
(2010–2024) as my US Economic Diffusion Index. It is simple to
comprehend by saying that the index generally goes lower between 2010
and 2015, indicating times of slower economic activity. The indicator
exhibits greater volatility between 2015 and 2020, but it also shows a
minor upward tendency, suggesting a moderate improvement in the economy.
As a result of the COVID-19 pandemic, there is a noticeable peak around
2020 and a sharp fall after that year.
- calculating the correlation coefficient
unemp avghr cpi cfnaid
unemp 1.0000000 -0.59759267 -0.62428677 0.19477706
avghr -0.5975927 1.00000000 0.98786874 -0.04384157
cpi -0.6242868 0.98786874 1.00000000 -0.07225501
cfnaid 0.1947771 -0.04384157 -0.07225501 1.00000000
In general, there is little correlation between my economic
indicators and the Chicago Fed National Activity Index: Diffusion Index.
This suggests that although there are a few small correlations, other
factors probably have a greater impact on the Chicago Fed National
Activity Index: Diffusion Index.
In particular:
There is a small but marginally positive link between the
unemployment rate and CFNAIDIFF (0.19477706).
The CPI (-0.07225501) and average hourly wages (-0.04384157) have
very little effect on CFNAIDIFF.
- a ggplot of the two series side by side.

This graph compares two important economic indicators: the Chicago
Fed National Activity Diffusion Index (CFNAIDIFF) from 2010 to 2024 and
the US Economy Diffusion Index, which I developed. Both indices track
shifts in the state of the economy over time.
The blue line represents the US Economy Diffusion Index, which
fluctuates sharply and frequently. This suggests a very unstable
economic climate where things might shift drastically very quickly. A
more steady pattern of economic activity is suggested by the CFNAIDIFF,
which is represented by the orange line and has smoother and fewer
dramatic variations.
The US Economy Diffusion Index shows more noticeable ups and downs
between 2010 and 2015, indicating faster economic shifts. The CFNAIDIFF,
meantime, continues its more steady, slow trend. The COVID-19 pandemic’s
economic effects are probably reflected in the CFNAIDIFF’s notable peak
and subsequent drop around 2020. Significant activity is also shown in
the blue line throughout this time, suggesting notable changes in the
economy. Both indicators’ graphs exhibit ups and downs following the
2020 era, although the US Economic Diffusion primarily remains in the
positive region with just one dip to a negative region. In contrast to
my US Economic Diffusion Index, which has some positive development
towards the end, the Chicago Fed National Activity Diffusion Index
(CFNAIDIFF) frequently slips to the negative region and displays a
deteriorating tendency.
Conclusion:
All things considered, this comparison shows how the two indices
differ in terms of volatility and stability. The Chicago Fed National
Activity Diffusion Index (CFNAIDIFF) offers a more stable view of
economic patterns, whereas the US Economy Diffusion Index indicates more
abrupt and significant changes in the economy. We can better grasp the
subtleties of how many economic indicators represent the general state
and activity of the economy with the aid of this research.
LS0tDQp0aXRsZTogIkZhbGwyNCBGaW5hbCBEaWZmdXNpb24gQ29uZnVzaW9uIEVjb24tNjYzNS0wNyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpzdXBwcmVzc1dhcm5pbmdzKHsNCiAgc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsNCmxpYnJhcnkobWFya292Y2hhaW4pDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocXVhbnRtb2QpDQpsaWJyYXJ5KHRzYm94KQ0KbGlicmFyeSh2YXJzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBkZmV0Y2gpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgIA0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShmb3JlY2FzdCkNCmxpYnJhcnkodHNib3gpDQpsaWJyYXJ5KHRzaWJibGUpDQpsaWJyYXJ5KHRpbWV0aykNCmxpYnJhcnkoVFNzdHVkaW8pDQpsaWJyYXJ5KHJpbykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZHlncmFwaHMpDQpsaWJyYXJ5KHF1YW50bW9kKSANCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkoY29ycnBsb3QpfSkNCn0pDQoNCmdldFN5bWJvbHMoYygiVU5SQVRFIiwgIkNFUzA1MDAwMDAwMDMiLCAiQ1BJQVVDU0wiLCAiQ0ZOQUlESUZGIiksIA0KICAgICAgICAgICAgICAgICAgICAgZnJlcSA9ICJtb250aGx5IiwgDQogICAgICAgICAgICAgICAgICAgICBzcmMgPSAiRlJFRCIsIHJldHVybi5jbGFzcyA9ICd4dHMnLA0KICAgICAgICAgICAgICAgICAgICAgaW5kZXguY2xhc3MgID0gJ0RhdGUnLA0KICAgICAgICAgICAgICAgICAgICAgZnJvbSA9ICIyMDEwLTAxLTAxIiwNCiAgICAgICAgICAgICAgICAgICAgIHRvID0gU3lzLkRhdGUoKSwNCiAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljaXR5ID0gIm1vbnRobHkiKQ0KDQpgYGANCg0KRGlmZnVzaW9uIEluZGV4IGFuZCBncmFwaCBpbiB2aWEgYSBnZ3Bsb3QgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQoNCg0KICAgICAgICAgICAgICB0c19pbmZvKFVOUkFURSkNCiAgICAgICAgICAgICAgdHNfaW5mbyhDRVMwNTAwMDAwMDAzKQ0KICAgICAgICAgICAgICB0c19pbmZvKENQSUFVQ1NMKQ0KdW5lbXAgPSBVTlJBVEUNCmF2Z2hyID0gQ0VTMDUwMDAwMDAwMw0KY3BpID0gQ1BJQVVDU0wNCg0KICAgICAgICAgICAgICB0c19pbmZvKHVuZW1wKQ0KICAgICAgICAgICAgICB0c19pbmZvKGF2Z2hyKQ0KICAgICAgICAgICAgICB0c19pbmZvKGNwaSkgICAgICAgIA0KICAgICAgICANCiAgICAgICAgICAgICAgI2NvdmVydCB0byB0cw0KICAgICAgICB1bmVtcCA8LSB1bmVtcFsiMjAxMC0wMS0wMS8yMDI0LTEwLTAxIl0gfD4gdHNfdHMoKSANCiAgICAgICAgYXZnaHIgPC0gYXZnaHJbIjIwMTAtMDEtMDEvMjAyNC0xMC0wMSJdIHw+IHRzX3RzKCkgDQogICAgICAgIGNwaSA8LSBjcGlbIjIwMTAtMDEtMDEvMjAyNC0xMC0wMSJdIHw+IHRzX3RzKCkgDQogICAgICAgICMNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgI2Fzc2VtYmxlIGl0DQogICAgICAgICAgICBteWRhdGEgPSBjYmluZC5kYXRhLmZyYW1lKHVuZW1wLGF2Z2hyLGNwaSkNCiAgICAgICAgICAgIGhlYWQobXlkYXRhLDMpDQogICAgICAgICAgICANCg0KICAgICAgICAgICAgICAgICAgIycgT2J0YWluIGZpcnN0IGRpZmZlcmVuY2VzDQogICAgICAgICAgICAgICAgICBteWRmID0gbXlkYXRhICU+JSANCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHVuZW1wRDEgPSB0c2liYmxlOjpkaWZmZXJlbmNlKHVuZW1wLCBkaWZmZXJlbmNlcyA9IDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnaHJEMSA9IHRzaWJibGU6OmRpZmZlcmVuY2UoYXZnaHIsIGRpZmZlcmVuY2VzID0gMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNwaUQxID0gdHNpYmJsZTo6ZGlmZmVyZW5jZShjcGksIGRpZmZlcmVuY2VzID0gMSkpICU+JSANCiAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChjKHVuZW1wRDEsIGF2Z2hyRDEsIGNwaUQxKSkgfD4gbmEub21pdCgpDQoNCiAgICAgICAgICAgICAgICAgIGNvbFN1bXMoaXMubmEobXlkZikpDQoNCiAgICAgICAgICAgICAgICAjIENvbnZlcnQgdG8gZWl0aGVyIHVwIG9yIGRvd24NCiAgICAgICAgICAgICAgICBoZWFkKG15ZGYsMykNCiAgICAgICAgICAgICAgICBteWRmX2RmID0gaWZlbHNlKG15ZGYgPiAwLCAxLCAtMSApDQogICAgICAgICAgICAgICAgbXlkZl9kZg0KICAgICAgICAgICAgICAgICAgICB0YWJsZShteWRmX2RmKQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICNjb252ZXJ0IHRvIHVwLGRvd24sIG9yIG5vIGNoYW5nZQ0KICAgICAgbXlkZl9tYXQgPSBhcHBseShteWRmLCAyLCBzaWduKSANCiAgICAgICAgICB0YWJsZShteWRmX21hdCkNCiAgICAgIG15ZGZfbWF0DQogICAgICANCg0KICAgICAgICAgICAgcG9zID0gYXBwbHkobXlkZl9tYXQsIDEsICBmdW5jdGlvbihyb3cpIHN1bShyb3c+MCkgKSAjIGNvdW50cyB0aGUgcG9zaXRpdmUNCiAgICAgICAgICAgIG5lZyA9IGFwcGx5KG15ZGZfbWF0LCAxLCAgZnVuY3Rpb24ocm93KSBzdW0ocm93PDApICkgIyBjb3VudHMgdGhlIG5lZ2F0aXZlcw0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgI3BvcyA9IGFwcGx5KG15ZGYsIDEsICBmdW5jdGlvbihyb3cpIHN1bShyb3c+MCkgKSAjIGNvdW50cyB0aGUgcG9zaXRpdmUNCiAgICAgICAgICAgICAgICAjbmVnID0gYXBwbHkobXlkZiwgMSwgIGZ1bmN0aW9uKHJvdykgc3VtKHJvdzwwKSApICMgY291bnRzIHRoZSBuZWdhdGl2ZXMNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdG90ID0gcG9zICsgbmVnDQogICAgICAgICAgICAoaW5kZXggPSAocG9zL3RvdCAtIG5lZy90b3QpKQ0KICAgICAgICAgICAgICAgIHRhYmxlKGluZGV4KQ0KICAgICAgICAgICAgICAgIHN0cihpbmRleCkNCiAgICAgICAgICAgICAgICANCkRhdGUgPSBzZXEuRGF0ZShmcm9tID0gYXMuRGF0ZSgiMjAxMC0wNS0xIiksIGxlbmd0aC5vdXQgPSAxNzcsIGJ5ID0gIm1vbnRoIikNCiAgICAgICAgICAgIGxlbmd0aChEYXRlKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaW5kZXhfZGYgPC0gZGF0YS5mcmFtZShpbmRleCA9IGluZGV4LCB0aW1lID0gRGF0ZSkgDQoNCiAgICAgICAgICAgICAgICBjYmluZChteWRmX21hdCwgcG9zLCBuZWcsIHRvdCwgaW5kZXgpDQoNCm1hX2luZGV4ID0gem9vOjpyb2xsbWVhbihpbmRleCwgNywgYWxpZ24gPSAicmlnaHQiKQ0KICAgIGxlbmd0aChpbmRleCkNCmBgYA0KVGhyZWUgVVMgZWNvbm9taWMgdmFyaWFibGVzIHdlcmUgdXNlZCB0byBwcm9kdWNlIHRoZSBEaWZmdXNpb24gSW5kZXggZm9yIHRoZSBVUyBlY29ub215OiB0aGUgdW5lbXBsb3ltZW50IHJhdGUgKFVOUkFURSksIHRoZSBhdmVyYWdlIGhvdXJseSBlYXJuaW5ncyBvZiBhbGwgZW1wbG95ZWVzIChDRVMwNTAwMDAwMDAzKSwgYW5kDQrigKIgQ1BJQVVDU0wsIG9yIHRoZSBDb25zdW1lciBQcmljZSBJbmRleCBmb3IgQWxsIFVyYmFuIENvbnN1bWVycw0KDQpUbyBlbmFibGUgc3RyYWlnaHRmb3J3YXJkIGludGVycHJldGF0aW9uLCB0aGUgZGF0YSBpcyB0aGVuIGNvbmRlbnNlZCBmb3IgdGhlIHllYXJzIDIwMTDigJMyMDI0IGF0IG1vbnRobHkgaW50ZXJ2YWxzLg0KDQpUbyBnYXVnZSB0aGUgY2hhbmdlcyBvdmVyIHRpbWUsIHRoZSBpbml0aWFsIGRpZmZlcmVuY2VzIHdlcmUgY29tcHV0ZWQgZm9yIGV2ZXJ5IHNlcmllcy4gQWZ0ZXIgdGhhdCwgdGhlIHZhcmlhdGlvbnMgd2VyZSB0cmFuc2Zvcm1lZCBpbnRvIHVwICgxKSwgZG93biAoLTEpLCBvciBubyBjaGFuZ2UgKDApLiBUaGlzIGNvbnZlcnNpb24gYWlkcyBpbiB0cmVuZCBhbmFseXNpcyBhbmQgRGlmZnVzaW9uIEluZGV4IGNvbXB1dGF0aW9uLg0KDQpUaGUgZm9sbG93aW5nIGZvcm11bGEgd2FzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBEaWZmdXNpb24gSW5kZXg6IERpZmZ1c2lvbiBJbmRleD0oUG9zaXRpdmVzL1RvdGFs4oiSTmVnYXRpdmVzL1RvdGFsKQ0KSW4gb3JkZXIgdG8gaW1wcm92ZSBpbnRlcnByZXRhYmlsaXR5LCB3ZSBzY2FsZWQgdGhlIHRpbWUgc2VyaWVzIG9mIG1vbnRobHkgRGlmZnVzaW9uIEluZGV4IHZhbHVlcyBmcm9tIC0xIHRvIDEgdG8gLTEwMCB0byAxMDAuDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpnZ3Bsb3QoaW5kZXhfZGYsIGFlcyh4ID0gdGltZSwgeT1pbmRleCkgKSArIA0KICAgICAgICAgICAgICAgICAgZ2VvbV9saW5lKGNvbG9yID0gImdyZWVuIikgKyAgICANCiAgICAgICAgICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImRhcmtyZWQiKSArIA0KICAgICAgICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJVUyBFY29ub215IERpZmZ1c2lvbiBJbmRleCIsIHggPSAiT2JzZXJ2YXRpb24iLCB5ID0gIkluZGV4IFZhbHVlIikgKyANCiAgICAgICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNClRoZSBncmFwaCBkaXNwbGF5cyBtdWx0aXBsZSBlY29ub21pYyBwZXJmb3JtYW5jZSBjeWNsZXMuDQoNCkZvciBleGFtcGxlLCB0aGVyZSBhcmUgdGltZXMgd2hlbiB0aGUgaW5kZXggc3RheXMgcG9zaXRpdmUgZm9yIGEgbG9uZyB0aW1lLCB3aGljaCBkZW5vdGVzIHN0ZWFkeSBlY29ub21pYyBleHBhbnNpb24uDQoNCkxvbmcgc3RyZXRjaGVzIGJlbG93IHplcm8sIG9uIHRoZSBvdGhlciBoYW5kLCBpbmRpY2F0ZSBwcm90cmFjdGVkIGVjb25vbWljIGRvd250dXJucy4NCg0KU2lnbmlmaWNhbnQgY2hhbmdlcyBpbiBwb2xpY3kgb3IgdGhlIGVjb25vbXkgbWF5IGJlIHJlZmxlY3RlZCBpbiBsYXJnZSBpbmRleCBzcGlrZXMgb3IgZGlwcy4NCg0KDQoyMDEw4oCTMjAxMjogVGhlIHllYXJzIGFmdGVyIHRoZSAyMDA4IGZpbmFuY2lhbCBjcmlzaXMsIHByb2JhYmx5IGluZGljYXRpbmcgYSByZWNvdmVyeS4NCg0KMjAxM+KAkzIwMTU6IFN0YWJsZSBlY29ub21pYyBleHBhbnNpb24gcGVyaW9kcy4NCg0KMjAyMDogQSBub3RhYmxlIGRlY2xpbmUgdGhhdCBtYXkgaGF2ZSBiZWVuIGJyb3VnaHQgb24gYnkgdGhlIENPVklELTE5IHBhbmRlbWljLg0KDQoyMDIx4oCTMjAyMzogUG9zdC1wYW5kZW1pYyBlY29ub21pYyByZWJvdW5kLg0KDQoNCkRpZmZ1c2lvbiBJbmRleCBhbmQgZ3JhcGggaW4gdmlhIGEgZ2dwbG90IHdpdGggYSBidWlsdCBpbiBzbW9vdGhlciBvciB5b3UgY3JlYXRlIHRoZSBzbW9vdGhlci4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZ2dwbG90KGluZGV4X2RmLCBhZXMoeCA9IHRpbWUsIHkgPSBpbmRleCkpICsNCiAgICAgICAgICBnZW9tX2xpbmUoY29sb3IgPSAiZGFya2dyZWVuIikrDQogICAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIikrDQogICAgICAgICAgZ2VvbV9zbW9vdGgoY29sb3VyID0gImdyZWVuIikgKw0KICAgICAgICAgIGxhYnMoIHRpdGxlID0gIlVTIEVjb25vbXkgRGlmZnVzaW9uIEluZGV4IHdpdGggU21vb3RoZXIiKSArDQogICAgICAgICAgeGxhYigiTW9udGhzIikgKw0KICAgICAgICAgIHlsYWIoIkNoYW5nZSIpKw0KICAgICAgICAgIHRoZW1lKGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKHNpemU9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpLCANCiAgICAgICAgICAgICAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShzaXplPSAwLjc1LCBjb2xvdXIgPSAiYmxhY2siKSwgDQogICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIA0KICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIGVsZW1lbnRfYmxhbmsoKSkgKw0KICAgICAgICAgIHRoZW1lX3R1ZnRlKCkNCg0KYGBgDQoNClRoZSBTbW9vdGhlciByZXByZXNlbnRzIHRoZSB0aW1lIGZyYW1lLiANCg0KMjAxMOKAkzIwMTI6IER1cmluZyB0aGlzIHRpbWUsIHZhbHVlcyBhcmUgcmlzaW5nIGFuZCByZW1haW5pbmcgcG9zaXRpdmUsIGluZGljYXRpbmcgYSByZWNvdmVyeSBwaGFzZSBmcm9tIHRoZSAyMDA4IGZpbmFuY2lhbCBjcmlzaXMuDQoNCjIwMTPigJMyMDE1OiBTdGFibGUgZWNvbm9taWMgY29uZGl0aW9ucyBhcmUgc2hvd24gYnkgcmVsYXRpdmUgc3RhYmlsaXR5LCB3aXRoIGxlc3MgdmFyaWF0aW9uIGFyb3VuZCB0aGUgemVybyBsaW5lLg0KDQoyMDIwOiBBIHN0ZWVwIGRyb3AgdGhhdCBtb3N0IGxpa2VseSByZWZsZWN0cyB0aGUgQ09WSUQtMTkgcGFuZGVtaWMncyBlY29ub21pYyBlZmZlY3RzLg0KDQoyMDIx4oCTMjAyMzogQSBwZXJpb2Qgb2YgcmVjb3ZlcnkgZHVyaW5nIHdoaWNoIHRoZSBpbmRleCByZXN1bWVzIGl0cyB1cHdhcmQgdHJhamVjdG9yeS4NCg0KSGVyZSwgdGhlIFNtb290aGVyIExpbmUgYXZlcmFnZXMgb3V0IHNob3J0LXRlcm0gdm9sYXRpbGl0eSB0byBoZWxwIHZpc3VhbGl6ZSB0aGUgdW5kZXJseWluZyB0cmVuZC4NCg0KQWRkaXRpb25hbGx5LCB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyBpbmRpY2F0ZWQgYnkgdGhlIGdyYXkgc2hhZGVkIGFyZWEsIHdoaWNoIGRpc3BsYXlzIHRoZSByYW5nZSB0aGF0IHRoZSBhY3R1YWwgdHJlbmQgbW9zdCBsaWtlbHkgbGllcyB3aXRoaW4uIEdyZWF0ZXIgY29uZmlkZW5jZSBpbiB0aGUgdHJlbmQgZXN0aW1hdGUgaXMgaW5kaWNhdGVkIGJ5IGEgbmFycm93ZXIgYmFuZC4NCg0KDQpDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBJbmRleDogRGlmZnVzaW9uIEluZGV4IChDRk5BSURJRkYpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpjZm5haWQgPSBDRk5BSURJRkYNCg0KdHNfaW5mbyhDRk5BSURJRkYpDQoNCiNjb252ZXJ0IHRvIHRzDQpjZm5haWQgPC0gY2ZuYWlkWyIyMDEwLTAxLTAxLzIwMjQtMTAtMDEiXSB8PiB0c190cygpDQoNCmxlbmd0aChjZm5haWQpDQoNCiMgQ29udmVydCBjZm5haWQgdG8gYSBkYXRhIGZyYW1lIA0KY2ZuYWlkX2RmIDwtIGRhdGEuZnJhbWUoRGF0ZSA9IERhdGUsIGNmbmFpZCA9IGFzLm51bWVyaWMoY2ZuYWlkWy1jKDEpXSkpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KGNmbmFpZF9kZiwgYWVzKHggPSBEYXRlLCB5ID0gY2ZuYWlkKSkgKw0KICAgICAgICAgIGdlb21fbGluZShjb2xvciA9ICJicm93biIpKw0KICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gInJlZCIpICsNCiAgICAgICAgICBnZW9tX3Ntb290aChjb2xvdXIgPSAidmlvbGV0IikgKw0KICAgICAgICAgIGxhYnMoIHRpdGxlID0gIkNoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IEluZGV4OiBEaWZmdXNpb24gSW5kZXggd2l0aCBzbW9vdGhlciIpICsNCiAgICAgICAgICB4bGFiKCJNb250aHMiKSArDQogICAgICAgICAgeWxhYigiQ2hhbmdlIikrDQogICAgICAgICAgdGhlbWUoYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZT0gMC43NSwgY29sb3VyID0gImJsYWNrIiksIA0KICAgICAgICAgICAgICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKHNpemU9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpLCANCiAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgDQogICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgZWxlbWVudF9ibGFuaygpKSArDQogICAgICAgICAgdGhlbWVfdHVmdGUoKQ0KDQpgYGANCg0KQWZ0ZXIgdGhhdCwgSSBhZGRlZCBhIHNtb290aGVyIHRvIHRoZSBkYXRhIGZvciB0aGUgQ2hpY2FnbyBGZWQgTmF0aW9uYWwgQWN0aXZpdHkgSW5kZXg6IERpZmZ1c2lvbiBJbmRleCBvdmVyIHRoZSBzYW1lIHRpbWUgZnJhbWUgKDIwMTDigJMyMDI0KSBhcyBteSBVUyBFY29ub21pYyBEaWZmdXNpb24gSW5kZXguIEl0IGlzIHNpbXBsZSB0byBjb21wcmVoZW5kIGJ5IHNheWluZyB0aGF0IHRoZSBpbmRleCBnZW5lcmFsbHkgZ29lcyBsb3dlciBiZXR3ZWVuIDIwMTAgYW5kIDIwMTUsIGluZGljYXRpbmcgdGltZXMgb2Ygc2xvd2VyIGVjb25vbWljIGFjdGl2aXR5LiBUaGUgaW5kaWNhdG9yIGV4aGliaXRzIGdyZWF0ZXIgdm9sYXRpbGl0eSBiZXR3ZWVuIDIwMTUgYW5kIDIwMjAsIGJ1dCBpdCBhbHNvIHNob3dzIGEgbWlub3IgdXB3YXJkIHRlbmRlbmN5LCBzdWdnZXN0aW5nIGEgbW9kZXJhdGUgaW1wcm92ZW1lbnQgaW4gdGhlIGVjb25vbXkuIEFzIGEgcmVzdWx0IG9mIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYywgdGhlcmUgaXMgYSBub3RpY2VhYmxlIHBlYWsgYXJvdW5kIDIwMjAgYW5kIGEgc2hhcnAgZmFsbCBhZnRlciB0aGF0IHllYXIuDQoNCg0KDQooaSkgY2FsY3VsYXRpbmcgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjb3JyZWxhdGlvbl9kZiA9IGNiaW5kLmRhdGEuZnJhbWUobXlkYXRhLGNmbmFpZCkNCg0KY29ycmVsYXRpb25fY29lZmZpY2llbnQgPSBjb3IoY29ycmVsYXRpb25fZGYpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY29ycmVsYXRpb25fY29lZmZpY2llbnQNCmBgYA0KDQpJbiBnZW5lcmFsLCB0aGVyZSBpcyBsaXR0bGUgY29ycmVsYXRpb24gYmV0d2VlbiBteSBlY29ub21pYyBpbmRpY2F0b3JzIGFuZCB0aGUgQ2hpY2FnbyBGZWQgTmF0aW9uYWwgQWN0aXZpdHkgSW5kZXg6IERpZmZ1c2lvbiBJbmRleC4gVGhpcyBzdWdnZXN0cyB0aGF0IGFsdGhvdWdoIHRoZXJlIGFyZSBhIGZldyBzbWFsbCBjb3JyZWxhdGlvbnMsIG90aGVyIGZhY3RvcnMgcHJvYmFibHkgaGF2ZSBhIGdyZWF0ZXIgaW1wYWN0IG9uIHRoZSBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBJbmRleDogRGlmZnVzaW9uIEluZGV4LiANCg0KSW4gcGFydGljdWxhcjoNCg0KVGhlcmUgaXMgYSBzbWFsbCBidXQgbWFyZ2luYWxseSBwb3NpdGl2ZSBsaW5rIGJldHdlZW4gdGhlIHVuZW1wbG95bWVudCByYXRlIGFuZCBDRk5BSURJRkYgKDAuMTk0Nzc3MDYpLg0KDQpUaGUgQ1BJICgtMC4wNzIyNTUwMSkgYW5kIGF2ZXJhZ2UgaG91cmx5IHdhZ2VzICgtMC4wNDM4NDE1NykgaGF2ZSB2ZXJ5IGxpdHRsZSBlZmZlY3Qgb24gQ0ZOQUlESUZGLg0KDQoNCihpaSkgYSBnZ3Bsb3Qgb2YgdGhlIHR3byBzZXJpZXMgc2lkZSBieSBzaWRlLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KY29tYmluZWRfZGF0YSA8LSBkYXRhLmZyYW1lKERhdGUgPSBEYXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVVMgRWNvbm9teSBEaWZmdXNpb24gSW5kZXhgID0gaW5kZXgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBEaWZmdXNpb24gSW5kZXhgID0gY2ZuYWlkWy0xXSkgDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoY29tYmluZWRfZGF0YSkgKyANCiAgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IFVTLkVjb25vbXkuRGlmZnVzaW9uLkluZGV4LCANCiAgICAgICAgICAgICAgICBjb2xvciA9ICJVUyBFY29ub215IERpZmZ1c2lvbiBJbmRleCIpKSArIA0KICBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ2hpY2Fnby5GZWQuTmF0aW9uYWwuQWN0aXZpdHkuRGlmZnVzaW9uLkluZGV4LCANCiAgICAgICAgICAgICAgICBjb2xvciA9ICJDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBEaWZmdXNpb24gSW5kZXgiKSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIikgKyANCiAgbGFicyh0aXRsZSA9ICJDb21wYXJpc29uIG9mIFVTIEVjb25vbXkgRGlmZnVzaW9uIEluZGV4IGFuZCBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBEaWZmdXNpb24gSW5kZXgiLCANCiAgICAgICB4ID0gIk1vbnRocyIsIHkgPSAiQ2hhbmdlIiwgY29sb3IgPSAgIkluZGV4IFR5cGUiKSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiVVMgRWNvbm9teSBEaWZmdXNpb24gSW5kZXgiID0gImdyZWVuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBEaWZmdXNpb24gSW5kZXgiID0gImJyb3duIikpICsgDQogIHRoZW1lKGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjc1LCBjb2xvdXIgPSAiYmxhY2siKSwgDQogICAgICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjc1LCBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICB0aGVtZV90dWZ0ZSgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkNCmBgYA0KDQpUaGlzIGdyYXBoIGNvbXBhcmVzIHR3byBpbXBvcnRhbnQgZWNvbm9taWMgaW5kaWNhdG9yczogdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IERpZmZ1c2lvbiBJbmRleCAoQ0ZOQUlESUZGKSBmcm9tIDIwMTAgdG8gMjAyNCBhbmQgdGhlIFVTIEVjb25vbXkgRGlmZnVzaW9uIEluZGV4LCB3aGljaCBJIGRldmVsb3BlZC4gQm90aCBpbmRpY2VzIHRyYWNrIHNoaWZ0cyBpbiB0aGUgc3RhdGUgb2YgdGhlIGVjb25vbXkgb3ZlciB0aW1lLg0KDQpUaGUgYmx1ZSBsaW5lIHJlcHJlc2VudHMgdGhlIFVTIEVjb25vbXkgRGlmZnVzaW9uIEluZGV4LCB3aGljaCBmbHVjdHVhdGVzIHNoYXJwbHkgYW5kIGZyZXF1ZW50bHkuIFRoaXMgc3VnZ2VzdHMgYSB2ZXJ5IHVuc3RhYmxlIGVjb25vbWljIGNsaW1hdGUgd2hlcmUgdGhpbmdzIG1pZ2h0IHNoaWZ0IGRyYXN0aWNhbGx5IHZlcnkgcXVpY2tseS4gQSBtb3JlIHN0ZWFkeSBwYXR0ZXJuIG9mIGVjb25vbWljIGFjdGl2aXR5IGlzIHN1Z2dlc3RlZCBieSB0aGUgQ0ZOQUlESUZGLCB3aGljaCBpcyByZXByZXNlbnRlZCBieSB0aGUgb3JhbmdlIGxpbmUgYW5kIGhhcyBzbW9vdGhlciBhbmQgZmV3ZXIgZHJhbWF0aWMgdmFyaWF0aW9ucy4NCg0KVGhlIFVTIEVjb25vbXkgRGlmZnVzaW9uIEluZGV4IHNob3dzIG1vcmUgbm90aWNlYWJsZSB1cHMgYW5kIGRvd25zIGJldHdlZW4gMjAxMCBhbmQgMjAxNSwgaW5kaWNhdGluZyBmYXN0ZXIgZWNvbm9taWMgc2hpZnRzLiBUaGUgQ0ZOQUlESUZGLCBtZWFudGltZSwgY29udGludWVzIGl0cyBtb3JlIHN0ZWFkeSwgc2xvdyB0cmVuZC4gVGhlIENPVklELTE5IHBhbmRlbWljJ3MgZWNvbm9taWMgZWZmZWN0cyBhcmUgcHJvYmFibHkgcmVmbGVjdGVkIGluIHRoZSBDRk5BSURJRkYncyBub3RhYmxlIHBlYWsgYW5kIHN1YnNlcXVlbnQgZHJvcCBhcm91bmQgMjAyMC4gU2lnbmlmaWNhbnQgYWN0aXZpdHkgaXMgYWxzbyBzaG93biBpbiB0aGUgYmx1ZSBsaW5lIHRocm91Z2hvdXQgdGhpcyB0aW1lLCBzdWdnZXN0aW5nIG5vdGFibGUgY2hhbmdlcyBpbiB0aGUgZWNvbm9teS4gDQpCb3RoIGluZGljYXRvcnMnIGdyYXBocyBleGhpYml0IHVwcyBhbmQgZG93bnMgZm9sbG93aW5nIHRoZSAyMDIwIGVyYSwgYWx0aG91Z2ggdGhlIFVTIEVjb25vbWljIERpZmZ1c2lvbiBwcmltYXJpbHkgcmVtYWlucyBpbiB0aGUgcG9zaXRpdmUgcmVnaW9uIHdpdGgganVzdCBvbmUgZGlwIHRvIGEgbmVnYXRpdmUgcmVnaW9uLiBJbiBjb250cmFzdCB0byBteSBVUyBFY29ub21pYyBEaWZmdXNpb24gSW5kZXgsIHdoaWNoIGhhcyBzb21lIHBvc2l0aXZlIGRldmVsb3BtZW50IHRvd2FyZHMgdGhlIGVuZCwgdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IERpZmZ1c2lvbiBJbmRleCAoQ0ZOQUlESUZGKSBmcmVxdWVudGx5IHNsaXBzIHRvIHRoZSBuZWdhdGl2ZSByZWdpb24gYW5kIGRpc3BsYXlzIGEgZGV0ZXJpb3JhdGluZyB0ZW5kZW5jeS4NCg0KDQoNCiMjIENvbmNsdXNpb246DQpBbGwgdGhpbmdzIGNvbnNpZGVyZWQsIHRoaXMgY29tcGFyaXNvbiBzaG93cyBob3cgdGhlIHR3byBpbmRpY2VzIGRpZmZlciBpbiB0ZXJtcyBvZiB2b2xhdGlsaXR5IGFuZCBzdGFiaWxpdHkuIFRoZSBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBEaWZmdXNpb24gSW5kZXggKENGTkFJRElGRikgb2ZmZXJzIGEgbW9yZSBzdGFibGUgdmlldyBvZiBlY29ub21pYyBwYXR0ZXJucywgd2hlcmVhcyB0aGUgVVMgRWNvbm9teSBEaWZmdXNpb24gSW5kZXggaW5kaWNhdGVzIG1vcmUgYWJydXB0IGFuZCBzaWduaWZpY2FudCBjaGFuZ2VzIGluIHRoZSBlY29ub215LiANCldlIGNhbiBiZXR0ZXIgZ3Jhc3AgdGhlIHN1YnRsZXRpZXMgb2YgaG93IG1hbnkgZWNvbm9taWMgaW5kaWNhdG9ycyByZXByZXNlbnQgdGhlIGdlbmVyYWwgc3RhdGUgYW5kIGFjdGl2aXR5IG9mIHRoZSBlY29ub215IHdpdGggdGhlIGFpZCBvZiB0aGlzIHJlc2VhcmNoLg0KDQoNCiMjIFJlZnJlbmNlczoNCg0KaHR0cHM6Ly9mcmVkLnN0bG91aXNmZWQub3JnLyANCg0KaHR0cHM6Ly9hcm9kcy1kb2NzLnNpdGU0NC5jb20vQ1RTY29yZWNhcmQuaHRtbCANCg0KDQoNCg0KDQoNCg0KDQoNCg==