DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogSm9oYW5uZXMgQmVyZyBb
bWFpbHRvOmpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXRdDQo+IFNlbnQ6IFRodXJzZGF5LCBNYXkg
MTcsIDIwMTIgMTI6NTAgUE0NCj4gVG86IERyZXdzLCBQYXVsDQo+IENjOiBQYXVsIFN0ZXdhcnQ7
IGxpbnZpbGxlQHR1eGRyaXZlci5jb20NCj4gU3ViamVjdDogUkU6IFBvc3NpYmxlIHJlZ3Jlc3Np
b24gcmVnYXJkaW5nIG11bHRpcGxlDQo+IFdMQU5fRUlEX0FQX0NIQU5fUkVQT1JUIGluIGJlYWNv
biBmcmFtZXMNCj4gDQo+IE9uIFRodSwgMjAxMi0wNS0xNyBhdCAxNDo0OCArMDAwMCwgRHJld3Ms
IFBhdWwgd3JvdGU6DQo+IA0KIA0KPiBJIHRob3VnaHQgYWJvdXQgdGhhdCBmb3IgYSBiaXQsIGJ1
dCBjb3VsZG4ndCBmaW5kIGFueXRoaW5nIHRoYXQgd291bGQNCj4gYWxsb3cgeW91IHRvIGxpc3Qg
dGhlIHNpbmdsZSB2YWx1ZXMgc2luY2UgeW91IGNhbid0IGRvIHw9IGluIGFuDQo+IGluaXRpYWxp
emVyLg0KPiANCj4gPiBJIGdhdGhlciBteSBkeW5hbWljLWluaXRpYWxpemF0aW9uIG1ldGhvZCBp
cyBub3QgbGlrZWx5IHRvDQo+ID4gYmUgYWNjZXB0ZWQgZXZlbiBpZiBzaG93biB0byBiZSBtdWx0
aXBsZS1DUFUtc2FmZT8NCj4gDQo+IFdlbGwsIEkganVzdCB0aGluayBpdCdzIHRoZSB3cm9uZyB0
cmFkZS1vZmYgLS0gdGhlIGNvZGUgbWF5IGJlIGEgYml0DQo+IG1vcmUgcmVhZGFibGUgYnV0IHRo
ZXJlJ3MgYSBsb3QgbW9yZSBjb2RlIGFuZCBhIGxvdCBtb3JlIGRhdGEgc2VjdGlvbg0KPiB3aGlj
aCBkb2Vzbid0IHNlZW0gd29ydGh3aGlsZSB3aGVuIHRoZSBhbHRlcm5hdGl2ZSBpc24ndCBodWdl
bHkgY29tcGxleA0KPiBlaXRoZXIuDQo+IA0KPiBqb2hhbm5lcw0KDQpPaywgSSBoYXZlIGEgdmVy
c2lvbiBvZiB0aGUgcGF0Y2ggdGhhdCBJJ20gaGFwcHkgd2l0aCBhdCB0aGlzIHBvaW50Lg0KKCkg
QnVpbGRzIHdpdGggbm8gZXJyb3JzIG9yIHdhcm5pbmcgYW5kIHdvcmtzIG9uIDMuNC1yYzcNCigp
IFBhc3NlcyBjaGVja3BhdGNoLnBsDQooKSBEb2VzIHN0YXRpYy1pbml0aWFsaXphdGlvbiBvZiB0
aGUgYml0bWFwIGluIGEgd2F5IHRoYXQgbGV0cyB0aGUNCiAgICBhdXRob3Igc3BlY2lmeSB0aGUg
dmFsdWVzIGluIGFueSBvbGQgb3JkZXIuICBPbmUgaW5jcmVtZW50YWwNCiAgICBsaW5lIG9mIHNv
dXJjZS1jb2RlIHBlciB2YWx1ZS4gIFByZXR0eSBlYXN5IHRvIG1haW50YWluIHRoZQ0KICAgIGxp
c3Qgb2YgdmFsdWVzLg0KKCkgUmVsaWVzIG9uIGNvbnN0YW50LWZvbGRpbmcgdG8ga2VlcCB0aGUg
Yml0bWFwIGluaXRpYWxpemF0aW9uIGNvbXBhY3QNCiAgICB3aXRob3V0IGV4dHJhIGZvb3Rwcmlu
dCBpbiBjb2RlLXNlY3Rpb24gb3IgZGF0YS1zZWN0aW9uLiAgVGhpcw0KICAgIGFsbCB3b3JrcyB3
aXRoIHNoaWZ0IG9wZXJhdG9ycyBpbnN0ZWFkIG9mIChzaHVkZGVyKSBiaXRmaWVsZCBvcGVyYXRv
cnMNCiAgICBJIG9yaWdpbmFsbHkgdGhvdWdodCBJIHdvdWxkIGhhdmUgdG8gdXNlLg0KKCkgVXNl
cyB0aGUgc3RhbmRhcmQgYml0b3BzLCBubyBuZWVkIHRvIHJvbGwteW91ci1vd24NCigpIElzIDMy
LWJpdCBhbmQgNjQtYml0IGNvbXBhdGlibGUgd2l0aCBvbmUgI2lmZGVmIGluIHRoZQ0KICAgICJi
b2lsZXItcGxhdGUiIHNlY3Rpb24gb2YgdGhlIGNvZGUuICBJIGRvbid0IHNlZSBhIHdheSBhcm91
bmQNCiAgIHRoaXMgI2lmZGVmDQoNClBhdGNoIGZvbGxvd3M6DQo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpGcm9tIGM4OTY3N2ZkMTlmMDcz
MWMzNjM3NDhiOTE0N2NkODcyZDVmYmQ1NjggTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxDQpGcm9t
OiBQYXVsIERyZXdzIDxwYXVsLmRyZXdzQGludGVsLmNvbT4NCkRhdGU6IFRodSwgMTcgTWF5IDIw
MTIgMTQ6MDc6MTEgLTA3MDANClN1YmplY3Q6IFtQQVRDSF0gbWFjODAyMTE6ICBBbGxvdyBhIG11
bHRpcGxpY2l0eSBvZiBXTEFOX0VJRF9BUF9DSEFOX1JFUE9SVA0KDQpBY2NvcmRpbmcgdG8gSUVF
RSBTdGQgODAyLjExLTIwMTIsIFNlY3Rpb24gMTAuMTEuMTgsIFRhYmxlDQo4LTY3LCBhbmQgdGhl
IGdyYW1tYXIgZm9yIGRvdDExQVBDaGFubmVsUmVwb3J0VGFibGUgaW5kaWNhdGUNCnRoYXQgdGhl
IFdMQU5fRUlEX0FQX0NIQU5fUkVQT1JUIGVsZW1lbnQgY2FuIGFwcGVhciBtdWx0aXBsZQ0KdGlt
ZXMgaW4gYSBmcmFtZSwgYnV0IHRoZSBmcmFtZSBwYXJzZXIgd2FzIGZsYWdnaW5nIGEgcGFyc2UN
CmVycm9yIGluIHRoaXMgY2FzZS4NCg0KVGhpcyBwYXRjaCBjaGFuZ2VzIHRoZSBsb2dpYyB3aGVu
IHBhcnNpbmcgaW5mb3JtYXRpb24NCmVsZW1lbnRzIGluIGZyYW1lcyBzbyB0aGF0IGl0IGNoZWNr
cyBhIGJpdG1hcCBvZiBlbGVtZW50IGlkcw0KdGhhdCBtdXN0IG5vdCBiZSBkdXBsaWNhdGVkLiAg
SWYgcHJlc2VudCBpbiB0aGlzIGJpdG1hcCB0aGUNCmVsZW1lbnQgbXVzdCBhcHBlYXIgYXQgbW9z
dCBvbmNlLCBvdGhlcndpc2UgZHVwbGljYXRlcyBhcmUNCmFsbG93ZWQuICBUaGlzIGFwcHJvYWNo
IGFsbG93cyBmb3IgYW4gb2xkZXIga2VybmVsIHZlcnNpb24NCnRvIHdvcmsgZ3JhY2VmdWxseSB3
aXRoIG5ld2x5LWRlZmluZWQgZWxlbWVudCBpZHMgdGhhdCBpdA0KZG9lc24ndCBrbm93IGFib3V0
Lg0KDQpTaWduZWQtb2ZmLWJ5OiBQYXVsIERyZXdzIDxwYXVsLmRyZXdzQGludGVsLmNvbT4NCi0t
LQ0KIG5ldC9tYWM4MDIxMS91dGlsLmMgfCAgMTM5ICsrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrLQ0KIDEgZmlsZXMgY2hhbmdlZCwgMTM3IGluc2VydGlv
bnMoKyksIDIgZGVsZXRpb25zKC0pDQoNCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdXRpbC5j
IGIvbmV0L21hYzgwMjExL3V0aWwuYw0KaW5kZXggMzJmN2EzYi4uMWM1MDE0YiAxMDA2NDQNCi0t
LSBhL25ldC9tYWM4MDIxMS91dGlsLmMNCisrKyBiL25ldC9tYWM4MDIxMS91dGlsLmMNCkBAIC01
NjUsNiArNTY1LDE0MiBAQCB2b2lkIGllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoc3RydWN0
IGllZWU4MDIxMV9odyAqaHcsDQogfQ0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3F1ZXVlX2Rl
bGF5ZWRfd29yayk7DQogDQorDQorLyoNCisgKiBCaXRtYXAgb2YgaW5mb3JtYXRpb24gZWxlbWVu
dCBJRHMgdGhhdCBkbyBub3QgYWxsb3cgbXVsdGlwbGUgb2NjdXJyZW5jZXMgaW4NCisgKiBhIGJl
YWNvbiBmcmFtZSBvciBwcm9iZSByZXBvbnNlLiAgQW55IEVJRFMgdGhhdCBkbyBub3QgaGF2ZSB0
aGVpciByZXNwZWN0aXZlDQorICogYml0IHNldCBhcmUgZWl0aGVyIHVua25vd24gdG8gdGhlIGNv
ZGUgKGUuZy4sIG5ld2x5IGRlZmluZSBieSB0aGUgODAyLjExDQorICogc3BlYyBhZnRlciB0aGlz
IGxpc3Qgd2FzIGxhc3QgdXBkYXRlZCkgb3IgYXJlIGtub3duIGJ1dCBhcmUgZGVmaW5lZCB0byBh
bGxvdw0KKyAqIG11bHRpcGxlIGluc3RhbmNlcy4gIFRoaXMgYWxsb3dzIHRoZSBiZWFjb24tZnJh
bWUgcGFyc2VyIHRvIGZsYWcNCisgKiBwYXJzZS1lcnJvcnMgZm9yIGtub3duLXByb2hpYml0ZWQg
ZHVwbGljYXRlcyBidXQgYmUgcGVybWlzc2l2ZSBmb3IgZnV0dXJlDQorICogdGhpbmdzIGl0IG1h
eSBub3Qga25vdyBhYm91dCB5ZXQuDQorICoNCisgKiBBIGZldyBtYWNyb3MgaGVscCB3aXRoIHN0
YXRpYy1pbml0aWFsaXphdGlvbiBvZiB0aGUgYml0bWFwLg0KKyAqLw0KKw0KKyNkZWZpbmUgQUxM
X01BU0tTKGlkeCkgKCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfU1NJRCwgaWR4KSB8
IFwNCisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9TVVBQX1JBVEVTLCBpZHgpIHwgXA0KKwlD
T05ESVRJT05BTF9NQVNLKFdMQU5fRUlEX0ZIX1BBUkFNUywgaWR4KSB8IFwNCisJQ09ORElUSU9O
QUxfTUFTSyhXTEFOX0VJRF9EU19QQVJBTVMsIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0so
V0xBTl9FSURfQ0ZfUEFSQU1TLCBpZHgpIHwgXA0KKwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlE
X1RJTSwgaWR4KSB8IFwNCisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9JQlNTX1BBUkFNUywg
aWR4KSB8IFwNCisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9DSEFMTEVOR0UsIGlkeCkgfCBc
DQorXA0KKwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlEX0NPVU5UUlksIGlkeCkgfCBcDQorCUNP
TkRJVElPTkFMX01BU0soV0xBTl9FSURfSFBfUEFSQU1TLCBpZHgpIHwgXA0KKwlDT05ESVRJT05B
TF9NQVNLKFdMQU5fRUlEX0hQX1RBQkxFLCBpZHgpIHwgXA0KKwlDT05ESVRJT05BTF9NQVNLKFdM
QU5fRUlEX1JFUVVFU1QsIGlkeCkgfCBcDQorXA0KKwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlE
X1FCU1NfTE9BRCwgaWR4KSB8IFwNCisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9FRENBX1BB
UkFNX1NFVCwgaWR4KSB8IFwNCisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9UU1BFQywgaWR4
KSB8IFwNCisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9UQ0xBUywgaWR4KSB8IFwNCisJQ09O
RElUSU9OQUxfTUFTSyhXTEFOX0VJRF9TQ0hFRFVMRSwgaWR4KSB8IFwNCisJQ09ORElUSU9OQUxf
TUFTSyhXTEFOX0VJRF9UU19ERUxBWSwgaWR4KSB8IFwNCisJQ09ORElUSU9OQUxfTUFTSyhXTEFO
X0VJRF9UQ0xBU19QUk9DRVNTSU5HLCBpZHgpIHwgXA0KKwlDT05ESVRJT05BTF9NQVNLKFdMQU5f
RUlEX1FPU19DQVBBLCBpZHgpIHwgXA0KKwkvKiA4MDIuMTF6ICovIFwNCisJQ09ORElUSU9OQUxf
TUFTSyhXTEFOX0VJRF9MSU5LX0lELCBpZHgpIHwgXA0KKwkvKiA4MDIuMTFzICovIFwNCisJQ09O
RElUSU9OQUxfTUFTSyhXTEFOX0VJRF9NRVNIX0NPTkZJRywgaWR4KSB8IFwNCisJQ09ORElUSU9O
QUxfTUFTSyhXTEFOX0VJRF9NRVNIX0lELCBpZHgpIHwgXA0KKwlDT05ESVRJT05BTF9NQVNLKFdM
QU5fRUlEX0xJTktfTUVUUklDX1JFUE9SVCwgaWR4KSB8IFwNCisJQ09ORElUSU9OQUxfTUFTSyhX
TEFOX0VJRF9DT05HRVNUSU9OX05PVElGSUNBVElPTiwgaWR4KSB8IFwNCisJQ09ORElUSU9OQUxf
TUFTSyhXTEFOX0VJRF9QRUVSX01HTVQsIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xB
Tl9FSURfQ0hBTl9TV0lUQ0hfUEFSQU0sIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xB
Tl9FSURfTUVTSF9BV0FLRV9XSU5ET1csIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xB
Tl9FSURfQkVBQ09OX1RJTUlORywgaWR4KSB8IFwNCisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJ
RF9NQ0NBT1BfU0VUVVBfUkVRLCBpZHgpIHwgXA0KKwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlE
X01DQ0FPUF9TRVRVUF9SRVNQLCBpZHgpIHwgXA0KKwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlE
X01DQ0FPUF9BRFZFUlQsIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfTUND
QU9QX1RFQVJET1dOLCBpZHgpIHwgXA0KKwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlEX0dBTk4s
IGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfUkFOTiwgaWR4KSB8IFwNCisJ
Q09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9QUkVRLCBpZHgpIHwgXA0KKwlDT05ESVRJT05BTF9N
QVNLKFdMQU5fRUlEX1BSRVAsIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURf
UEVSUiwgaWR4KSB8IFwNCisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9QWFUsIGlkeCkgfCBc
DQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfUFhVQywgaWR4KSB8IFwNCisJQ09ORElUSU9O
QUxfTUFTSyhXTEFOX0VJRF9BVVRIX01FU0hfUEVFUl9FWENILCBpZHgpIHwgXA0KKwlDT05ESVRJ
T05BTF9NQVNLKFdMQU5fRUlEX01JQywgaWR4KSB8IFwNCitcDQorCUNPTkRJVElPTkFMX01BU0so
V0xBTl9FSURfUFdSX0NPTlNUUkFJTlQsIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xB
Tl9FSURfUFdSX0NBUEFCSUxJVFksIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9F
SURfVFBDX1JFUVVFU1QsIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfVFBD
X1JFUE9SVCwgaWR4KSB8IFwNCisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9TVVBQT1JURURf
Q0hBTk5FTFMsIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfQ0hBTk5FTF9T
V0lUQ0gsIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfTUVBU1VSRV9SRVFV
RVNULCBpZHgpIHwgXA0KKwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlEX01FQVNVUkVfUkVQT1JU
LCBpZHgpIHwgXA0KKwkvKiBhbGxvdyBtdWx0aXBsZSBXTEFOX0VJRF9RVUlFVCAqLyBcDQorCUNP
TkRJVElPTkFMX01BU0soV0xBTl9FSURfSUJTU19ERlMsIGlkeCkgfCBcDQorXA0KKwlDT05ESVRJ
T05BTF9NQVNLKFdMQU5fRUlEX0VSUF9JTkZPLCBpZHgpIHwgXA0KKwlDT05ESVRJT05BTF9NQVNL
KFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLCBpZHgpIHwgXA0KK1wNCisJQ09ORElUSU9OQUxfTUFT
SyhXTEFOX0VJRF9IVF9DQVBBQklMSVRZLCBpZHgpIHwgXA0KKwlDT05ESVRJT05BTF9NQVNLKFdM
QU5fRUlEX0hUX0lORk9STUFUSU9OLCBpZHgpIHwgXA0KK1wNCisJQ09ORElUSU9OQUxfTUFTSyhX
TEFOX0VJRF9SU04sIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfTU1JRSwg
aWR4KSB8IFwNCisJLyogZHVwbGljYXRlIG9mIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQyBXTEFO
X0VJRF9XUEEgKi8gXA0KKwkvKiBkdXBsaWNhdGUgb2YgV0xBTl9FSURfVkVORE9SX1NQRUNJRklD
IFdMQU5fRUlEX0dFTkVSSUMgKi8gXA0KKwkvKiBhbGxvdyBtdWx0aXBsZSBXTEFOX0VJRF9WRU5E
T1JfU1BFQ0lGSUMgKi8gXA0KKwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlEX1FPU19QQVJBTUVU
RVIsIGlkeCkgfCBcDQorXA0KKwkvKiBhbGxvdyBtdWx0aXBsZSBXTEFOX0VJRF9BUF9DSEFOX1JF
UE9SVCAqLyBcDQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfTkVJR0hCT1JfUkVQT1JULCBp
ZHgpIHwgXA0KKwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlEX1JDUEksIGlkeCkgfCBcDQorCUNP
TkRJVElPTkFMX01BU0soV0xBTl9FSURfQlNTX0FWR19BQ0NFU1NfREVMQVksIGlkeCkgfCBcDQor
CUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfQU5URU5OQV9JTkZPLCBpZHgpIHwgXA0KKwlDT05E
SVRJT05BTF9NQVNLKFdMQU5fRUlEX1JTTkksIGlkeCkgfCBcDQorCUNPTkRJVElPTkFMX01BU0so
V0xBTl9FSURfTUVBU1VSRU1FTlRfUElMT1RfVFhfSU5GTywgaWR4KSB8IFwNCisJQ09ORElUSU9O
QUxfTUFTSyhXTEFOX0VJRF9CU1NfQVZBSUxBQkxFX0NBUEFDSVRZLCBpZHgpIHwgXA0KKwlDT05E
SVRJT05BTF9NQVNLKFdMQU5fRUlEX0JTU19BQ19BQ0NFU1NfREVMQVksIGlkeCkgfCBcDQorCUNP
TkRJVElPTkFMX01BU0soV0xBTl9FSURfUlJNX0VOQUJMRURfQ0FQQUJJTElUSUVTLCBpZHgpIHwg
XA0KKwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlEX01VTFRJUExFX0JTU0lELCBpZHgpIHwgXA0K
KwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlEX0JTU19DT0VYXzIwNDAsIGlkeCkgfCBcDQorCUNP
TkRJVElPTkFMX01BU0soV0xBTl9FSURfT1ZFUkxBUF9CU1NfU0NBTl9QQVJBTSwgaWR4KSB8IFwN
CisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9FWFRfQ0FQQUJJTElUWSwgaWR4KSB8IFwNCitc
DQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfTU9CSUxJVFlfRE9NQUlOLCBpZHgpIHwgXA0K
KwlDT05ESVRJT05BTF9NQVNLKFdMQU5fRUlEX0ZBU1RfQlNTX1RSQU5TSVRJT04sIGlkeCkgfCBc
DQorCUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfVElNRU9VVF9JTlRFUlZBTCwgaWR4KSB8IFwN
CisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9SSUNfREFUQSwgaWR4KSB8IFwNCisJQ09ORElU
SU9OQUxfTUFTSyhXTEFOX0VJRF9SSUNfREVTQ1JJUFRPUiwgaWR4KSB8IFwNCitcDQorCUNPTkRJ
VElPTkFMX01BU0soV0xBTl9FSURfRFNFX1JFR0lTVEVSRURfTE9DQVRJT04sIGlkeCkgfCBcDQor
CUNPTkRJVElPTkFMX01BU0soV0xBTl9FSURfU1VQUE9SVEVEX1JFR1VMQVRPUllfQ0xBU1NFUywg
aWR4KSB8IFwNCisJQ09ORElUSU9OQUxfTUFTSyhXTEFOX0VJRF9FWFRfQ0hBTlNXSVRDSF9BTk4s
IGlkeCkgfCBcDQorCTApDQorDQorI2RlZmluZSBDT05ESVRJT05BTF9NQVNLKG9yZGluYWwsIGlk
eCkgXA0KKwkoKEJJVF9XT1JEKG9yZGluYWwpID09IGlkeCkgPyAgQklUX01BU0sob3JkaW5hbCkg
OiAwKQ0KKw0KKyNpZiBCSVRTX1BFUl9MT05HID09IDMyDQorc3RhdGljIERFQ0xBUkVfQklUTUFQ
KHNpbmdsZXRvbl9tYXAsIDI1NikgPSB7DQorCVswXSA9IEFMTF9NQVNLUygwKSwNCisJWzFdID0g
QUxMX01BU0tTKDEpLA0KKwlbMl0gPSBBTExfTUFTS1MoMiksDQorCVszXSA9IEFMTF9NQVNLUygz
KSwNCisJWzRdID0gQUxMX01BU0tTKDQpLA0KKwlbNV0gPSBBTExfTUFTS1MoNSksDQorCVs2XSA9
IEFMTF9NQVNLUyg2KSwNCisJWzddID0gQUxMX01BU0tTKDcpLA0KK307DQorI2VsaWYgQklUU19Q
RVJfTE9ORyA9PSA2NA0KK3N0YXRpYyBERUNMQVJFX0JJVE1BUChzaW5nbGV0b25fbWFwLCAyNTYp
ID0gew0KKwlbMF0gPSBBTExfTUFTS1MoMCksDQorCVsxXSA9IEFMTF9NQVNLUygxKSwNCisJWzJd
ID0gQUxMX01BU0tTKDIpLA0KKwlbM10gPSBBTExfTUFTS1MoMyksDQorfTsNCisjZWxzZQ0KKyNl
cnJvciAiYWRqdXN0IHlvdXIgPGFzbS9iaXRzcGVybG9uZy5oPiBkZWZpbmVzIg0KKyNlbmRpZg0K
Kw0KIHUzMiBpZWVlODAyXzExX3BhcnNlX2VsZW1zX2NyYyh1OCAqc3RhcnQsIHNpemVfdCBsZW4s
DQogCQkJICAgICAgIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICplbGVtcywNCiAJCQkgICAgICAg
dTY0IGZpbHRlciwgdTMyIGNyYykNCkBAIC01OTIsOCArNzI4LDcgQEAgdTMyIGllZWU4MDJfMTFf
cGFyc2VfZWxlbXNfY3JjKHU4ICpzdGFydCwgc2l6ZV90IGxlbiwNCiAJCQlicmVhazsNCiAJCX0N
CiANCi0JCWlmIChpZCAhPSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMgJiYNCi0JCSAgICBpZCAh
PSBXTEFOX0VJRF9RVUlFVCAmJg0KKwkJaWYgKHRlc3RfYml0KGlkLCBzaW5nbGV0b25fbWFwKSAm
Jg0KIAkJICAgIHRlc3RfYml0KGlkLCBzZWVuX2VsZW1zKSkgew0KIAkJCWVsZW1zLT5wYXJzZV9l
cnJvciA9IHRydWU7DQogCQkJbGVmdCAtPSBlbGVuOw0KLS0gDQoxLjcuMy40DQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQo=
On Fri, 2012-05-18 at 17:31 +0000, Drews, Paul wrote:
> Ok, I have a version of the patch that I'm happy with at this point.
> () Builds with no errors or warning and works on 3.4-rc7
> () Passes checkpatch.pl
> () Does static-initialization of the bitmap in a way that lets the
> author specify the values in any old order. One incremental
> line of source-code per value. Pretty easy to maintain the
> list of values.
> () Relies on constant-folding to keep the bitmap initialization compact
> without extra footprint in code-section or data-section. This
> all works with shift operators instead of (shudder) bitfield operators
> I originally thought I would have to use.
> () Uses the standard bitops, no need to roll-your-own
> () Is 32-bit and 64-bit compatible with one #ifdef in the
> "boiler-plate" section of the code. I don't see a way around
> this #ifdef
Wow, that's pretty impressive :-) I gave up way earlier I guess.
> +#define ALL_MASKS(idx) ( \
> + CONDITIONAL_MASK(WLAN_EID_SSID, idx) | \
> +#define CONDITIONAL_MASK(ordinal, idx) \
> + ((BIT_WORD(ordinal) == idx) ? BIT_MASK(ordinal) : 0)
...
> +#if BITS_PER_LONG == 32
> +static DECLARE_BITMAP(singleton_map, 256) = {
> + [0] = ALL_MASKS(0),
> + [1] = ALL_MASKS(1),
> + [2] = ALL_MASKS(2),
> + [3] = ALL_MASKS(3),
> + [4] = ALL_MASKS(4),
> + [5] = ALL_MASKS(5),
> + [6] = ALL_MASKS(6),
> + [7] = ALL_MASKS(7),
> +};
> +#elif BITS_PER_LONG == 64
> +static DECLARE_BITMAP(singleton_map, 256) = {
> + [0] = ALL_MASKS(0),
> + [1] = ALL_MASKS(1),
> + [2] = ALL_MASKS(2),
> + [3] = ALL_MASKS(3),
> +};
> +#else
> +#error "adjust your <asm/bitsperlong.h> defines"
> +#endif
And we don't even need to touch this directly, nice!
johannes