This is a multi-part message in MIME format. --------------090501040906060407020202 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 27-Mar-10 18:41, Dwayne Reid wrote: > > Does anyone have code snippets available? Links to existing > code? I'd like to learn how to do this. > > Found this one long time ago. Works 100%! Mark ========================================== This is DTMF decoding program, provided by: Stephen James Hardy (T/A SW Tekno) Canberra, Australia hardy@sweng.stortek.com ======== Source code ======== ; Caveat: Requires tone duration of 160ms. DTMF standard only ; requires 50ms tone. ; This source code is copyright (C) 1996 to Stephen James Hardy. ; Permission is hereby granted to reproduce, assemble and run this code ; for non-commercial purposes providing this notice is not removed ; from source code copies. ; ; This source code is provided as-is with no warranty expressed or ; implied. Do not use where damage to persons or property may result ; from source code failure. ; ; Written for the 16C84, but should run on most any 16Cxx... ; ; Target configuration: ; PORTB: Sample input as unsigned binary. With a 16C7x, change the ; code to read the ADC instead. ; PORTA: Connnected to 5 LEDs: ; RA0-3 : indicate decoded tone (0-F) ; RA4 : 0 if tone OK, 1 if tone not recognised. ; Osc: 10MHz xtal. ; ; Assemble using MPASM /C- flag. ; ; list p=pic16c84 include "p16c84.inc" ; Mchip standard include radix dec ; NB: If the following is changed, check assembly to ensure timer ; constants (TONEL0 etc) fit in 1 byte. CLKSPD equ 10 ; Target clock speed (MHz) ; Register mapping: RBASE equ 0Ch ; First general register. ;------------------ ; Bank 0 registers. Rather profligate use made thereof. Could be ; reduced with a bit of twiddling. ;------------------ cblock RBASE dtmf_code1 ; Result of first trial dtmf_code2 ; Result of 2nd trial dtmf_r ; Result of high- or low-group trial dtmf_rr ; Temp result dtmf_t1l ; Regs for correlation accumulators. dtmf_t1h dtmf_t2l dtmf_t2h dtmf_tc ; Tick counter for timing dtmf_tcc ; Tick counter reload constant dtmf_sc ; Sample counter for 1 tone dtmf_st ; Sample state (0-3) dtmf_cs ; Latest sample dtmf_sl ; sum/avg low dtmf_sh ; sum/avg high dtmf_ml ; max low dtmf_mh ; max high endc org 0 ;------------------------ ; Power-up initialisation ;------------------------ pwrup bsf status,rp0 ; Select bank 2 ; Set RB pullups, falling edge interrupt, increment t0 on instruction cycle, ; assign prescaler to WDT (not used), prescale 1:1. movlw (1< dtmf_r done_lg btfsc dtmf_r,7 ; Done lg: check result reg (0-3 or FF) retlw 0FFh ; Return if uncertain movf dtmf_r,w movwf dtmf_code1 ; Move to code result 1 call dtmf_hg ; Sample for high group => dtmf_r done_hg btfsc dtmf_r,7 ; Done hg: check result retlw 0FFh ; return if uncertain bcf status,C rlf dtmf_r rlf dtmf_r,w ; *4, into W iorwf dtmf_code1,f ; Or in low group ; Now repeat to make sure... call dtmf_lg ; Sample for low group => dtmf_r btfsc dtmf_r,7 ; check result reg (0-3 or FF) retlw 0FFh ; Return if uncertain movf dtmf_r,w movwf dtmf_code2 ; Move to code result 2 call dtmf_hg ; Sample for high group => dtmf_r btfsc dtmf_r,7 retlw 0FFh ; return if uncertain bcf status,C rlf dtmf_r rlf dtmf_r,w ; *4, into W iorwf dtmf_code2 ; Or in low group (result in W) ; Check if both agree subwf dtmf_code1,f ; code1 = code1 - code2 btfss status,Z ; equal? retlw 0FFh ; no, return uncertain. return ; else return w = DTMF code. ; Sample for all low group tones, select the largest. dtmf_lg clrf dtmf_sl ; Clear sum clrf dtmf_sh clrf dtmf_ml ; Clear max clrf dtmf_mh clrf dtmf_rr ; Tone 0 movlw TONEL0 movwf dtmf_tcc ; Set timer constant for low tone 0. call dtmf_samp ; Sample etc. incf dtmf_rr movlw TONEL1 movwf dtmf_tcc ; Set timer constant for low tone 1. call dtmf_samp ; Sample etc. incf dtmf_rr movlw TONEL2 movwf dtmf_tcc ; Set timer constant for low tone 2. call dtmf_samp ; Sample etc. incf dtmf_rr movlw TONEL3 movwf dtmf_tcc ; Set timer constant for low tone 3. call dtmf_samp ; Sample etc. dtmf_g bcf status,C rrf dtmf_sh ; Div sum by 4 to get average rrf dtmf_sl dtmf_01 bcf status,C rrf dtmf_sh rrf dtmf_sl ; while dtmf_mh non zero, div m and s by 2. movf dtmf_mh,w btfsc status,Z goto dtmf_02 bcf status,C rrf dtmf_mh rrf dtmf_ml goto dtmf_01 ; Now results in LSB. Mult s (avg) by 1.5 dtmf_02 bcf status,C rrf dtmf_sl,w addwf dtmf_sl,w btfsc status,C goto dtmf_03 ; Return uncertain if carry. ; Compare with m (max). If max is not >= 1.5*avg, then uncertain. subwf dtmf_ml,w ; w = max - 1.5*avg. C set if >= 0 (OK) btfsc status,C return ; return OK (result in dtmf_r) dtmf_03 movlw 0FFh movwf dtmf_r ; set uncertain result return ; Sample for all high group tones, select the largest. dtmf_hg clrf dtmf_sl ; Clear sum clrf dtmf_sh clrf dtmf_ml ; Clear max clrf dtmf_mh clrf dtmf_rr ; Tone 0 movlw TONEH0 movwf dtmf_tcc ; Set timer constant for high tone 0. call dtmf_samp ; Sample etc. incf dtmf_rr movlw TONEH1 movwf dtmf_tcc ; Set timer constant for high tone 1. call dtmf_samp ; Sample etc. incf dtmf_rr movlw TONEH2 movwf dtmf_tcc ; Set timer constant for high tone 2. call dtmf_samp ; Sample etc. incf dtmf_rr movlw TONEH3 movwf dtmf_tcc ; Set timer constant for high tone 3. call dtmf_samp ; Sample etc. goto dtmf_g ; Go to common processing for lo, hi groups ; ; This routine performs all samples for a particular tone. It selects ; the largest correlation into dtmf_t1l/h (which is the return value). ; dtmf_samp movlw SAMPSPC*WAVES ; Total samples movwf dtmf_sc ; move to sample counter clrf dtmf_st ; Initial state clrf dtmf_t1l ; Clear correlation accumulators clrf dtmf_t1h clrf dtmf_t2l clrf dtmf_t2h ; ; Main sample loop. The code is written to take a constant number of ; cycles no matter what. This explains some of the odd things like ; seemingly unnecessary goto's. ; dtmf_lp movf portb,w ; 1 - Get sample (e.g. from port B) movwf dtmf_cs ; 2 -Save it movlw high dtmf_bstate ; 3 movwf pclath ; 4 movf dtmf_st,w ; 5 - Get current state addwf pcl,f ; 6,7 - Branch on state (0-3) dtmf_bstate goto dtmf_st0 ; 8,9 - Check asm list to make sure all goto dtmf_st1 ; of these 4 instr's on same 256-byte page goto dtmf_st2 ; goto dtmf_st3 ; dtmf_st0 movf dtmf_cs,w ; 10 - Get sample addwf dtmf_t1l,f ; 11 - Add to accumulator btfsc status,C ; 12,13 - Test carry out incf dtmf_t1h ; 13 - Increment high byte if carry out goto dtmf_join ; 14,15 - continue common dtmf_st1 movf dtmf_cs,w ; Get sample addwf dtmf_t2l,f ; Add to accumulator btfsc status,C ; Test carry out incf dtmf_t2h ; Increment high byte if carry out goto dtmf_join ; continue common dtmf_st2 comf dtmf_cs,w ; Get 'negative' sample addwf dtmf_t1l,f ; Add to accumulator btfsc status,C ; Test carry out incf dtmf_t1h ; Increment high byte if carry out goto dtmf_join ; continue common dtmf_st3 comf dtmf_cs,w ; Get 'negative' sample addwf dtmf_t2l,f ; Add to accumulator btfsc status,C ; Test carry out incf dtmf_t2h ; Increment high byte if carry out goto dtmf_join ; continue common dtmf_join incf dtmf_st,w ; 16 andlw 3 ; 17 movwf dtmf_st ; 18 - Update state decfsz dtmf_sc ; 19,20 - Decrement sample count goto dtmf_tmr ; 20,21 - If not finished, sample again ; Finished samples, select largest from dtmf_t1 and dtmf_t2 into dtmf_t1. ; Average expected value is subtracted, abs value taken. Avg expected ; value is WAVES in high byte, zero in low byte. dtmf_lx movlw WAVES subwf dtmf_t1h,f ; t1 -= expavg btfss dtmf_t1h,7 ; t1 -ve? goto $+3 ; no, skip next comf dtmf_t1h ; Negate (don't worry about the 1 diff!) comf dtmf_t1l movlw WAVES subwf dtmf_t2h,f ; t2 -= expavg btfss dtmf_t2h,7 ; t2 -ve? goto $+3 ; no, skip next comf dtmf_t2h comf dtmf_t2l movf dtmf_t1h,w subwf dtmf_t2h,w ; w = t2h-t1h (C set if t1h<=t2h) btfss status,C goto dtmf_04 ; cont if t1 > t2 btfss status,Z goto dtmf_swap ; move t2->t1 if t2>t1 movf dtmf_t1l,w ; high equal, test low subwf dtmf_t2l,w ; w = t2l-t1l btfss status,C goto dtmf_04 ; cont if t1 > t2 dtmf_swap movf dtmf_t2h,w ; Set t1 = t2 (return value) movwf dtmf_t1h movf dtmf_t2l,w movwf dtmf_t1l ; ; Sum. dtmf_04 movf dtmf_t1l,w addwf dtmf_sl,f movf dtmf_t1h,w btfsc status,C addlw 1 addwf dtmf_sh,f ; ; Compare with current maximum. If greater, set new max. dtmf_05 movf dtmf_mh,w subwf dtmf_t1h,w ; w = t1h-mh (C set if mh<=t1h) btfss status,C return ; ret if m > t1 btfss status,Z goto dtmf_sw2 ; move t1->m if t1>m movf dtmf_ml,w ; high equal, test low subwf dtmf_t1l,w ; w = t1l-ml btfss status,C return ; ret if m > t1 dtmf_sw2 movf dtmf_t1h,w ; Set m = t1 movwf dtmf_mh movf dtmf_t1l,w movwf dtmf_ml movf dtmf_rr,w ; Tone number movwf dtmf_r ; Set new tone number return ; Waste time until ready for next sample dtmf_tmr movlw FIXDLAY ; 22 - Constant delay movwf dtmf_tc ; 23 decfsz dtmf_tc ; 24,25 goto $-1 ; movf dtmf_tcc,w ; 26+3(n-1) movwf dtmf_tc ; 27 - Load tick counter constant dtmf_wtim decfsz dtmf_tc ; Decrement tick counter goto dtmf_wtim ; Tight loop until zero goto dtmf_lp ; 28,29 - Get next sample end --------------090501040906060407020202 Content-Type: text/plain; name="DTMF_DEC.TXT" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="DTMF_DEC.TXT" VGhpcyBpcyBEVE1GIGRlY29kaW5nIHByb2dyYW0sIHByb3ZpZGVkIGJ5Og0KU3RlcGhlbiBK YW1lcyBIYXJkeSAoVC9BIFNXIFRla25vKSBDYW5iZXJyYSwgQXVzdHJhbGlhDQpoYXJkeUBz d2VuZy5zdG9ydGVrLmNvbQ0KDQo9PT09PT09PSBTb3VyY2UgY29kZSA9PT09PT09PQ0KDQo7 IENhdmVhdDogUmVxdWlyZXMgdG9uZSBkdXJhdGlvbiBvZiAxNjBtcy4gIERUTUYgc3RhbmRh cmQgb25seQ0KOyByZXF1aXJlcyA1MG1zIHRvbmUuDQoNCjsgVGhpcyBzb3VyY2UgY29kZSBp cyBjb3B5cmlnaHQgKEMpIDE5OTYgdG8gU3RlcGhlbiBKYW1lcyBIYXJkeS4NCjsgUGVybWlz c2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byByZXByb2R1Y2UsIGFzc2VtYmxlIGFuZCBydW4g dGhpcyBjb2RlDQo7IGZvciBub24tY29tbWVyY2lhbCBwdXJwb3NlcyBwcm92aWRpbmcgdGhp cyBub3RpY2UgaXMgbm90IHJlbW92ZWQNCjsgZnJvbSBzb3VyY2UgY29kZSBjb3BpZXMuDQo7 DQo7IFRoaXMgc291cmNlIGNvZGUgaXMgcHJvdmlkZWQgYXMtaXMgd2l0aCBubyB3YXJyYW50 eSBleHByZXNzZWQgb3INCjsgaW1wbGllZC4gIERvIG5vdCB1c2Ugd2hlcmUgZGFtYWdlIHRv IHBlcnNvbnMgb3IgcHJvcGVydHkgbWF5IHJlc3VsdA0KOyBmcm9tIHNvdXJjZSBjb2RlIGZh aWx1cmUuDQo7DQo7IFdyaXR0ZW4gZm9yIHRoZSAxNkM4NCwgYnV0IHNob3VsZCBydW4gb24g bW9zdCBhbnkgMTZDeHguLi4NCjsNCjsgVGFyZ2V0IGNvbmZpZ3VyYXRpb246DQo7ICAgUE9S VEI6IFNhbXBsZSBpbnB1dCBhcyB1bnNpZ25lZCBiaW5hcnkuICBXaXRoIGEgMTZDN3gsIGNo YW5nZSB0aGUNCjsgICAgICAgICAgY29kZSB0byByZWFkIHRoZSBBREMgaW5zdGVhZC4NCjsg ICBQT1JUQTogQ29ubm5lY3RlZCB0byA1IExFRHM6DQo7ICAgICAgICAgIFJBMC0zIDogaW5k aWNhdGUgZGVjb2RlZCB0b25lICgwLUYpDQo7ICAgICAgICAgIFJBNCAgIDogMCBpZiB0b25l IE9LLCAxIGlmIHRvbmUgbm90IHJlY29nbmlzZWQuDQo7ICAgT3NjOiAxME1IeiB4dGFsLg0K Ow0KOyBBc3NlbWJsZSB1c2luZyBNUEFTTSAvQy0gZmxhZy4NCjsNCjsNCiAgICAgICAgbGlz dCAgICBwPXBpYzE2Yzg0DQogICAgICAgIGluY2x1ZGUgInAxNmM4NC5pbmMiICAgIDsgTWNo aXAgc3RhbmRhcmQgaW5jbHVkZQ0KICAgICAgICByYWRpeCAgIGRlYw0KDQo7IE5COiBJZiB0 aGUgZm9sbG93aW5nIGlzIGNoYW5nZWQsIGNoZWNrIGFzc2VtYmx5IHRvIGVuc3VyZSB0aW1l cg0KOyBjb25zdGFudHMgKFRPTkVMMCBldGMpIGZpdCBpbiAxIGJ5dGUuDQpDTEtTUEQgIGVx dSAgICAgMTAgICAgICAgICAgICAgIDsgVGFyZ2V0IGNsb2NrIHNwZWVkIChNSHopDQoNCjsg UmVnaXN0ZXIgbWFwcGluZzoNClJCQVNFICAgZXF1ICAgICAwQ2ggICAgICAgICAgICAgOyBG aXJzdCBnZW5lcmFsIHJlZ2lzdGVyLg0KDQo7LS0tLS0tLS0tLS0tLS0tLS0tDQo7IEJhbmsg MCByZWdpc3RlcnMuICBSYXRoZXIgcHJvZmxpZ2F0ZSB1c2UgbWFkZSB0aGVyZW9mLiAgQ291 bGQgYmUNCjsgcmVkdWNlZCB3aXRoIGEgYml0IG9mIHR3aWRkbGluZy4NCjstLS0tLS0tLS0t LS0tLS0tLS0NCg0KICAgICAgICBjYmxvY2sgIFJCQVNFDQoNCg0KICAgICAgICBkdG1mX2Nv ZGUxICAgICAgICAgICAgICA7IFJlc3VsdCBvZiBmaXJzdCB0cmlhbA0KICAgICAgICBkdG1m X2NvZGUyICAgICAgICAgICAgICA7IFJlc3VsdCBvZiAybmQgdHJpYWwNCiAgICAgICAgZHRt Zl9yICAgICAgICAgICAgICAgICAgOyBSZXN1bHQgb2YgaGlnaC0gb3IgbG93LWdyb3VwIHRy aWFsDQogICAgICAgIGR0bWZfcnIgICAgICAgICAgICAgICAgIDsgVGVtcCByZXN1bHQNCg0K ICAgICAgICBkdG1mX3QxbCAgICAgICAgICAgICAgICA7IFJlZ3MgZm9yIGNvcnJlbGF0aW9u IGFjY3VtdWxhdG9ycy4NCiAgICAgICAgZHRtZl90MWgNCiAgICAgICAgZHRtZl90MmwNCiAg ICAgICAgZHRtZl90MmgNCg0KICAgICAgICBkdG1mX3RjICAgICAgICAgICAgICAgICA7IFRp Y2sgY291bnRlciBmb3IgdGltaW5nDQogICAgICAgIGR0bWZfdGNjICAgICAgICAgICAgICAg IDsgVGljayBjb3VudGVyIHJlbG9hZCBjb25zdGFudA0KDQogICAgICAgIGR0bWZfc2MgICAg ICAgICAgICAgICAgIDsgU2FtcGxlIGNvdW50ZXIgZm9yIDEgdG9uZQ0KICAgICAgICBkdG1m X3N0ICAgICAgICAgICAgICAgICA7IFNhbXBsZSBzdGF0ZSAoMC0zKQ0KICAgICAgICBkdG1m X2NzICAgICAgICAgICAgICAgICA7IExhdGVzdCBzYW1wbGUNCg0KICAgICAgICBkdG1mX3Ns ICAgICAgICAgICAgICAgICA7IHN1bS9hdmcgbG93DQogICAgICAgIGR0bWZfc2ggICAgICAg ICAgICAgICAgIDsgc3VtL2F2ZyBoaWdoDQogICAgICAgIGR0bWZfbWwgICAgICAgICAgICAg ICAgIDsgbWF4IGxvdw0KICAgICAgICBkdG1mX21oICAgICAgICAgICAgICAgICA7IG1heCBo aWdoDQoNCiAgICAgICAgZW5kYw0KDQoNCg0KDQogICAgICAgIG9yZyAgICAgMA0KDQo7LS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo7IFBvd2VyLXVwIGluaXRpYWxpc2F0aW9uDQo7LS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnB3cnVwICAgYnNmICAgICBzdGF0dXMscnAwICAg ICAgOyBTZWxlY3QgYmFuayAyDQo7IFNldCBSQiBwdWxsdXBzLCBmYWxsaW5nIGVkZ2UgaW50 ZXJydXB0LCBpbmNyZW1lbnQgdDAgb24gaW5zdHJ1Y3Rpb24gY3ljbGUsDQo7IGFzc2lnbiBw cmVzY2FsZXIgdG8gV0RUIChub3QgdXNlZCksIHByZXNjYWxlIDE6MS4NCiAgICAgICAgbW92 bHcgICAoMTw8cHNhKQ0KICAgICAgICBtb3Z3ZiAgIG9wdGlvbl9yZWcNCiAgICAgICAgY2xy ZiAgICB0cmlzYSAgICAgICAgICAgOyBTZXQgcG9ydCBBIHRvIG91dHB1dHMNCiAgICAgICAg bW92bHcgICAwRkZoDQogICAgICAgIG1vdndmICAgdHJpc2IgICAgICAgICAgIDsgU2V0IHBv cnQgQiB0byBpbnB1dHMNCiAgICAgICAgY2xyZiAgICBzdGF0dXMgICAgICAgICAgOyBCYWNr IHRvIGJhbmsgMC4NCg0KDQpkZW1vX2R0bWZfbGlzdGVuDQogICAgICAgIGJjZiAgICAgaW50 Y29uLEdJRSAgICAgIDsgRGlzYWJsZSBpbnRlcnJ1cHRzDQogICAgICAgIGNhbGwgICAgZHRt Zl9saXN0ZW4gICAgIDsgRG8gaXQuLi4NCjsgVyBjb250YWlucyBjb2RlDQogICAgICAgIG1v dndmICAgcG9ydGEgICAgICAgICAgIDsgU2hvdyBvbiBMRURzIGF0dGFjaGVkIHRvIHBvcnQg QS4NCiAgICAgICAgZ290byAgICBkZW1vX2R0bWZfbGlzdGVuICAgICAgICA7IC4uLmZvcmV2 ZXINCg0KDQoNCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQ0KOyBkdG1mX2xpc3RlbjogIERldGVjdHMgYW5kIGRlY29k ZXMgRFRNRiB0b25lcyBhcHBsaWVkIHRvIHRoZSBBREMuDQo7DQo7IEludGVycnVwdHMgbXVz dCBiZSBkaXNhYmxlZCAoYXMgd3JpdHRlbikgc2luY2UgaW5zdHJ1Y3Rpb24gY3ljbGUNCjsg Y291bnRpbmcgaXMgdXNlZCB0byBwZXJmb3JtIHRpbWluZy4gIFRoaXMgcmVzdHJpY3Rpb24g bWF5IGJlIHJlbW92ZWQNCjsgaWYgcmV3cml0dGVuIHRvIHVzZSBpbnRlcnJ1cHRzIHRvIHBl cmZvcm0gY29udHJvbGxlZCB0aW1lYmFzZSBzYW1wbGluZy4NCjsNCjsgT24gcmV0dXJuIFcg Y29udGFpbnMgdGhlIERUTUYgc2lnbmFsICgwLTE1KSB3aXRoIGZvbGxvd2luZyBjb3JyZXNw b25kZW5jZQ0KOyB0byBzdGFuZGFyZCB0ZWxlcGhvbmUga2V5cGFkOg0KOyBXICAgICBLZXkN CjsgLSAgICAgLS0tDQo7IDAgICAgIDENCjsgMSAgICAgNA0KOyAyICAgICA3DQo7IDMgICAg ICoNCjsgNCAgICAgMg0KOyA1ICAgICA1DQo7IDYgICAgIDgNCjsgNyAgICAgMA0KOyA4ICAg ICAzDQo7IDkgICAgIDYNCjsgQSAgICAgOQ0KOyBCICAgICAjDQo7IEMgICAgIEENCjsgRCAg ICAgQg0KOyBFICAgICBDDQo7IEYgICAgIEQNCjsgaS5lIHRoZSAyIExTQnMgb2YgVyBpbmRl eCB0aGUgbG93IHRvbmUgZ3JvdXAsIGFuZCB0aGUgb3RoZXIgMiBiaXRzDQo7IGluZGV4IHRo ZSBoaWdoIHRvbmUgZ3JvdXAuDQo7IEluIHRoZSBjYXNlIHRoYXQgbm8gdG9uZSB3YXMgcmVs aWFibHkgZGV0ZWN0ZWQsIFcgY29udGFpbnMgRkYuDQo7DQo7IE5vdGU6ICA4LWJpdCBBREMg aXMgdXNlZC4gIEZvciBtYXhpbXVtIHJlbGlhYmlsaXR5LCB0aGUgRFRNRiB0b25lDQo7IHNo b3VsZCB1c2UgdGhlIGZ1bGwgcmFuZ2Ugb2YgdGhlIEFEQy4gIEhvd2V2ZXIsIGlmIHRoZSBs b3ctIGFuZA0KOyBoaWdoLWdyb3VwIHRvbmVzIGFyZSB3aXRoaW4gMWRCIG9mIGVhY2ggb3Ro ZXIsIGl0IGlzIHBvc3NpYmxlIHRvDQo7IHVzZSBhIDEtYml0IEFEQyAoaS5lLiBjb21wYXJh dG9yKQ0KOw0KOyBBbGdvcml0aG06DQo7IFRoZSBlaWdodCBwb3NzaWJsZSB0b25lcyB1c2Vk IGluIERUTUYgYXJlIHNlYXJjaGVkIGZvciBvbmUtYnktb25lLg0KOyBUaGlzIGFwcHJvYWNo IGlzIGFsbG93YWJsZSBiZWNhdXNlIG9mIHRoZSAyMDBtcyByZXF1aXJlZCBmb3IgZWFjaA0K OyBzaWduYWwuICA3OC4ydXMgYXJlIGFsbG9jYXRlZCBmb3Igc2FtcGxpbmcgKGEgdG90YWwg b2YgNCoxMCo4DQo7IHNhbXBsZXM7IHRoaXMgaXMgcmVwZWF0ZWQgZm9yIHJlbGlhYmlsaXR5 IGhlbmNlIHNhbXBsaW5nIHRha2VzDQo7IDE1Ni40bXMgd2hpY2ggYWxsb3dzIHRoZSByZXN0 IG9mIHRoZSBhcHBsaWNhdGlvbiBhIGZldyBtcyB0byBkZXRlcm1pbmUNCjsgd2hldGhlciBh IHRvbmUgaXMgcHJlc2VudC4NCjsNCjsgU2luY2Ugb25lIHRvbmUgaXMgYmVpbmcgc2VhcmNo ZWQgZm9yIGF0IGEgdGltZSwgdGhlIGZvbGxvd2luZyBtZXRob2QNCjsgaXMgYXBwcm9wcmlh dGU6ICBTYW1wbGUgYXQgNCB0aW1lcyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBzZWFyY2ggdG9u ZSwNCjsgZm9yIGEgdG90YWwgb2YgMTAgd2F2ZXMuICBUaGlzIGFsbG93cyBjb3JyZWxhdGlv biBvZiB0aGUgc2lnbmFsIHdpdGgNCjsgdGhlIHNlYXJjaCB0b25lOyBhIGhpZ2ggY29ycmVs YXRpb24gaW5kaWNhdGluZyB0aGUgdG9uZSBpcyBwcmVzZW50Lg0KOyAxMCB3YXZlcyBhcmUg c2VsZWN0ZWQgc2luY2UgdGhlIERUTUYgdG9uZXMgZGlmZmVyIGJ5IDEwJSBzdGVwcy4gIFRo ZQ0KOyBvdGhlciB0b25lcyB3aWxsIHRodXMgY2FuY2VsIG91dCB3aGVuIGNvcnJlbGF0ZWQg d2l0aCB0aGUgc2VhcmNoIHRvbmUNCjsgKGFzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIG9ydGhv Z29uYWxpdHkgb2YgdGhlIHNpbmUgZnVuY3Rpb24gYmFzaXMpLg0KOw0KOyBUaGUgOCB0b25l cyBhcmUgdHJpZWQgaW4gc2VxdWVuY2UuICBUaGUgbGFyZ2VzdCBjb3JyZWxhdGlvbiBmcm9t IGVhY2gNCjsgb2YgdGhlIGhpZ2ggYW5kIGxvdyB0b25lIGdyb3VwcyBpcyBzZWxlY3RlZC4g IElmIHRoZSBoaWdoZXN0IGNvcnJlbCBpbg0KOyBlYWNoIGdyb3VwIGlzIGdyZWF0ZXIgdGhh biBvciBlcXVhbCAxLjUgdGltZXMgdGhlIGF2ZXJhZ2UsIHRoZW4NCjsgdGhhdCB0b25lIGlz IGFkanVkZ2VkIHByZXNlbnQuICBJZiBib3RoIHRoZSBoaWdoIGFuZCBsb3cgdG9uZSBncm91 cA0KOyBpcyBwcmVzZW50LCBhbiBpbml0aWFsIERUTUYgY29kZSBpcyBkZWNpZGVkLiAgVGhl IHByb2Nlc3MgaXMgcmVwZWF0ZWQNCjsgYW5kLCBpZiB0aGUgc2FtZSBjb2RlIGlzIHByZXNl bnQgdGhlIG5leHQgdGltZSwgdGhhdCBjb2RlIGlzIHJldHVybmVkLg0KOyBPdGhlcndpc2Us IHRoZSAndW5jZXJ0YWluJyBjb2RlIChGRikgaXMgcmV0dXJuZWQuDQo7DQo7LS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N ClNBTVBTUEMgZXF1ICAgICA0ICAgICAgICAgICAgICAgOyBTYW1wbGUgcG9pbnRzIHBlciB0 b25lIGN5Y2xlLiAgRG9uJ3QgY2hhbmdlIQ0KV0FWRVMgICBlcXUgICAgIDEwICAgICAgICAg ICAgICA7IE51bWJlciBvZiB0b25lIGN5Y2xlcyB0byBzYW1wbGUNClNJTlRWTCAgZXF1ICAg ICAyNTAwMDAqQ0xLU1BEL1NBTVBTUEMgOyBQSUMgY3ljbGVzIGJldHdlZW4gc2FtcGxlcyBh dCBmPTFIeg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IC0gZGl2aWRlIGJ5 IHRvbmUgKEh6KSB0byBnZXQgY3ljbGVzLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA7IEZvciBEVE1GLCB3aWxsIHJhbmdlIGZyb20gODk3ICg2OTdIeikNCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgOyB0byAzODIgKDE2MzNIeikgYXQgMTBNSHogeHRh bC4NCkZJWERMQVkgZXF1ICAgICAzNiAgICAgICAgICAgICAgOyBGaXhlZCBkZWxheSB0byBt YWtlIGZvbGxvd2luZyA8PSAyNTYuDQogICAgICAgOyBTZWxlY3QgYWNjb3JkaW5nIHRvIHRo ZSBmb3JtdWxhOg0KICAgICAgIDsgRklYRExBWSA9IDI5Ljg5KkNMS1NQRCAtIDI2My43DQog ICAgICAgOyAocm91bmQgdXApLg0KU0xDWUNMRVMgZXF1ICAgIChGSVhETEFZLTEpKjMrMjkg IDsgUElDIGN5Y2xlcyB0YWtlbiBpbiB0aGUgZHRtZl9scCBsb29wDQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDsgbm90IGNvdW50aW5nIHRoZSB3YWl0IGxvb3AgYXQgZHRt Zl93dGltDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ29kZSBpcyBkZXNp Z25lZCBzbyB0aGlzIGlzIGNvbnN0YW50IQ0KVExDWUNMRVMgZXF1ICAgIDMgICAgICAgICAg ICAgICA7IE51bWJlciBvZiBQSUMgY3ljbGVzIHBlciB3YWl0IGxvb3AsDQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDsgMSBsZXNzIHRoYW4gdGhpcyBvbiBsYXN0IGV4ZWN1 dGlvbi4NCjsgTG9vcCBjb25zdGFudHMgZm9yIGVhY2ggRFRNRiB0b25lLiBNdXN0IGJlIDEu LjI1NiBpbmNsdXNpdmUuICBUT05FTDANCjsgaXMgdGhlIGxhcmdlc3QgYW5kIHNob3VsZCBi ZSBtYWRlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIDI1NiBieSBhZGp1c3RpbmcNCjsgdGhl IGNvbnN0YW50IEZJWERMQVkgKGFuZCBoZW5jZSBTTENZQ0xFUykuICBUaGUgc21hbGxlc3Qg Y29uc3RhbnQNCjsgKFRPTkVIMykgc2hvdWxkIGFsc28gYmUgYXMgbGFyZ2UgYXMgcG9zc2li bGUgZm9yIGFjY3VyYWN5IC0gdGhpcyBwbGFjZXMNCjsgbGltaXRzIG9uIHRoZSBsb3dlc3Qg Y2xvY2sgc3BlZWQgdGhhdCB3aWxsIHdvcmsuICBNaW4gY2xvY2sgc3BlZWQgc2hvdWxkDQo7 IGJlIGFyb3VuZCAzLjdNSHouICBJZiBjbG9jayBpcyBmYXN0ZXIgdGhhbiAxNy4zTUh6LCB0 aGVuIHRoZSBjb2RlIHdpbGwNCjsgbmVlZCB0byBiZSBtb2RpZmllZCB0byBhZGQgeWV0IG1v cmUgZGVsYXkgc2luY2UgRklYRExBWSB3aWxsIGJlIG92ZXIgMjU2Lg0KVE9ORUwwICBlcXUg ICAgIChTSU5UVkwvNjk3LVNMQ1lDTEVTKS9UTENZQ0xFUw0KVE9ORUwxICBlcXUgICAgIChT SU5UVkwvNzcwLVNMQ1lDTEVTKS9UTENZQ0xFUw0KVE9ORUwyICBlcXUgICAgIChTSU5UVkwv ODUyLVNMQ1lDTEVTKS9UTENZQ0xFUw0KVE9ORUwzICBlcXUgICAgIChTSU5UVkwvOTQxLVNM Q1lDTEVTKS9UTENZQ0xFUw0KVE9ORUgwICBlcXUgICAgIChTSU5UVkwvMTIwOS1TTENZQ0xF UykvVExDWUNMRVMNClRPTkVIMSAgZXF1ICAgICAoU0lOVFZMLzEzMzYtU0xDWUNMRVMpL1RM Q1lDTEVTDQpUT05FSDIgIGVxdSAgICAgKFNJTlRWTC8xNDc3LVNMQ1lDTEVTKS9UTENZQ0xF Uw0KVE9ORUgzICBlcXUgICAgIChTSU5UVkwvMTYzMy1TTENZQ0xFUykvVExDWUNMRVMNCg0K ZHRtZl9saXN0ZW4NCiAgICAgICAgY2FsbCAgICBkdG1mX2xnICAgICAgICAgOyBTYW1wbGUg Zm9yIGxvdyBncm91cCA9PiBkdG1mX3INCmRvbmVfbGcgYnRmc2MgICBkdG1mX3IsNyAgICAg ICAgOyBEb25lIGxnOiBjaGVjayByZXN1bHQgcmVnICgwLTMgb3IgRkYpDQogICAgICAgIHJl dGx3ICAgMEZGaCAgICAgICAgICAgIDsgUmV0dXJuIGlmIHVuY2VydGFpbg0KICAgICAgICBt b3ZmICAgIGR0bWZfcix3DQogICAgICAgIG1vdndmICAgZHRtZl9jb2RlMSAgICAgIDsgTW92 ZSB0byBjb2RlIHJlc3VsdCAxDQogICAgICAgIGNhbGwgICAgZHRtZl9oZyAgICAgICAgIDsg U2FtcGxlIGZvciBoaWdoIGdyb3VwID0+IGR0bWZfcg0KZG9uZV9oZyBidGZzYyAgIGR0bWZf ciw3ICAgICAgICA7IERvbmUgaGc6IGNoZWNrIHJlc3VsdA0KICAgICAgICByZXRsdyAgIDBG RmggICAgICAgICAgICA7IHJldHVybiBpZiB1bmNlcnRhaW4NCiAgICAgICAgYmNmICAgICBz dGF0dXMsQw0KICAgICAgICBybGYgICAgIGR0bWZfcg0KICAgICAgICBybGYgICAgIGR0bWZf cix3ICAgICAgICA7ICo0LCBpbnRvIFcNCiAgICAgICAgaW9yd2YgICBkdG1mX2NvZGUxLGYg ICAgOyBPciBpbiBsb3cgZ3JvdXANCjsgTm93IHJlcGVhdCB0byBtYWtlIHN1cmUuLi4NCiAg ICAgICAgY2FsbCAgICBkdG1mX2xnICAgICAgICAgOyBTYW1wbGUgZm9yIGxvdyBncm91cCA9 PiBkdG1mX3INCiAgICAgICAgYnRmc2MgICBkdG1mX3IsNyAgICAgICAgOyBjaGVjayByZXN1 bHQgcmVnICgwLTMgb3IgRkYpDQogICAgICAgIHJldGx3ICAgMEZGaCAgICAgICAgICAgIDsg UmV0dXJuIGlmIHVuY2VydGFpbg0KICAgICAgICBtb3ZmICAgIGR0bWZfcix3DQogICAgICAg IG1vdndmICAgZHRtZl9jb2RlMiAgICAgIDsgTW92ZSB0byBjb2RlIHJlc3VsdCAyDQogICAg ICAgIGNhbGwgICAgZHRtZl9oZyAgICAgICAgIDsgU2FtcGxlIGZvciBoaWdoIGdyb3VwID0+ IGR0bWZfcg0KICAgICAgICBidGZzYyAgIGR0bWZfciw3DQogICAgICAgIHJldGx3ICAgMEZG aCAgICAgICAgICAgIDsgcmV0dXJuIGlmIHVuY2VydGFpbg0KICAgICAgICBiY2YgICAgIHN0 YXR1cyxDDQogICAgICAgIHJsZiAgICAgZHRtZl9yDQogICAgICAgIHJsZiAgICAgZHRtZl9y LHcgICAgICAgIDsgKjQsIGludG8gVw0KICAgICAgICBpb3J3ZiAgIGR0bWZfY29kZTIgICAg ICA7IE9yIGluIGxvdyBncm91cCAocmVzdWx0IGluIFcpDQo7IENoZWNrIGlmIGJvdGggYWdy ZWUNCiAgICAgICAgc3Vid2YgICBkdG1mX2NvZGUxLGYgICAgOyBjb2RlMSA9IGNvZGUxIC0g Y29kZTINCiAgICAgICAgYnRmc3MgICBzdGF0dXMsWiAgICAgICAgOyBlcXVhbD8NCiAgICAg ICAgcmV0bHcgICAwRkZoICAgICAgICAgICAgOyBubywgcmV0dXJuIHVuY2VydGFpbi4NCiAg ICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgOyBlbHNlIHJldHVybiB3ID0gRFRNRiBj b2RlLg0KDQoNCjsgU2FtcGxlIGZvciBhbGwgbG93IGdyb3VwIHRvbmVzLCBzZWxlY3QgdGhl IGxhcmdlc3QuDQpkdG1mX2xnIGNscmYgICAgZHRtZl9zbCAgICAgICAgIDsgQ2xlYXIgc3Vt DQogICAgICAgIGNscmYgICAgZHRtZl9zaA0KICAgICAgICBjbHJmICAgIGR0bWZfbWwgICAg ICAgICA7IENsZWFyIG1heA0KICAgICAgICBjbHJmICAgIGR0bWZfbWgNCiAgICAgICAgY2xy ZiAgICBkdG1mX3JyICAgICAgICAgOyBUb25lIDANCiAgICAgICAgbW92bHcgICBUT05FTDAN CiAgICAgICAgbW92d2YgICBkdG1mX3RjYyAgICAgICAgOyBTZXQgdGltZXIgY29uc3RhbnQg Zm9yIGxvdyB0b25lIDAuDQogICAgICAgIGNhbGwgICAgZHRtZl9zYW1wICAgICAgIDsgU2Ft cGxlIGV0Yy4NCiAgICAgICAgaW5jZiAgICBkdG1mX3JyDQogICAgICAgIG1vdmx3ICAgVE9O RUwxDQogICAgICAgIG1vdndmICAgZHRtZl90Y2MgICAgICAgIDsgU2V0IHRpbWVyIGNvbnN0 YW50IGZvciBsb3cgdG9uZSAxLg0KICAgICAgICBjYWxsICAgIGR0bWZfc2FtcCAgICAgICA7 IFNhbXBsZSBldGMuDQogICAgICAgIGluY2YgICAgZHRtZl9ycg0KICAgICAgICBtb3ZsdyAg IFRPTkVMMg0KICAgICAgICBtb3Z3ZiAgIGR0bWZfdGNjICAgICAgICA7IFNldCB0aW1lciBj b25zdGFudCBmb3IgbG93IHRvbmUgMi4NCiAgICAgICAgY2FsbCAgICBkdG1mX3NhbXAgICAg ICAgOyBTYW1wbGUgZXRjLg0KICAgICAgICBpbmNmICAgIGR0bWZfcnINCiAgICAgICAgbW92 bHcgICBUT05FTDMNCiAgICAgICAgbW92d2YgICBkdG1mX3RjYyAgICAgICAgOyBTZXQgdGlt ZXIgY29uc3RhbnQgZm9yIGxvdyB0b25lIDMuDQogICAgICAgIGNhbGwgICAgZHRtZl9zYW1w ICAgICAgIDsgU2FtcGxlIGV0Yy4NCmR0bWZfZyAgYmNmICAgICBzdGF0dXMsQw0KICAgICAg ICBycmYgICAgIGR0bWZfc2ggICAgICAgICA7IERpdiBzdW0gYnkgNCB0byBnZXQgYXZlcmFn ZQ0KICAgICAgICBycmYgICAgIGR0bWZfc2wNCmR0bWZfMDEgYmNmICAgICBzdGF0dXMsQw0K ICAgICAgICBycmYgICAgIGR0bWZfc2gNCiAgICAgICAgcnJmICAgICBkdG1mX3NsDQo7IHdo aWxlIGR0bWZfbWggbm9uIHplcm8sIGRpdiBtIGFuZCBzIGJ5IDIuDQogICAgICAgIG1vdmYg ICAgZHRtZl9taCx3DQogICAgICAgIGJ0ZnNjICAgc3RhdHVzLFoNCiAgICAgICAgZ290byAg ICBkdG1mXzAyDQogICAgICAgIGJjZiAgICAgc3RhdHVzLEMNCiAgICAgICAgcnJmICAgICBk dG1mX21oDQogICAgICAgIHJyZiAgICAgZHRtZl9tbA0KICAgICAgICBnb3RvICAgIGR0bWZf MDENCjsgTm93IHJlc3VsdHMgaW4gTFNCLiAgTXVsdCBzIChhdmcpIGJ5IDEuNQ0KZHRtZl8w MiBiY2YgICAgIHN0YXR1cyxDDQogICAgICAgIHJyZiAgICAgZHRtZl9zbCx3DQogICAgICAg IGFkZHdmICAgZHRtZl9zbCx3DQogICAgICAgIGJ0ZnNjICAgc3RhdHVzLEMNCiAgICAgICAg Z290byAgICBkdG1mXzAzICAgICAgICAgOyBSZXR1cm4gdW5jZXJ0YWluIGlmIGNhcnJ5Lg0K OyBDb21wYXJlIHdpdGggbSAobWF4KS4gIElmIG1heCBpcyBub3QgPj0gMS41KmF2ZywgdGhl biB1bmNlcnRhaW4uDQogICAgICAgIHN1YndmICAgZHRtZl9tbCx3ICAgICAgIDsgdyA9IG1h eCAtIDEuNSphdmcuICBDIHNldCBpZiA+PSAwIChPSykNCiAgICAgICAgYnRmc2MgICBzdGF0 dXMsQw0KICAgICAgICByZXR1cm4gICAgICAgICAgICAgICAgICA7IHJldHVybiBPSyAocmVz dWx0IGluIGR0bWZfcikNCmR0bWZfMDMgbW92bHcgICAwRkZoDQogICAgICAgIG1vdndmICAg ZHRtZl9yICAgICAgICAgIDsgc2V0IHVuY2VydGFpbiByZXN1bHQNCiAgICAgICAgcmV0dXJu DQoNCg0KOyBTYW1wbGUgZm9yIGFsbCBoaWdoIGdyb3VwIHRvbmVzLCBzZWxlY3QgdGhlIGxh cmdlc3QuDQpkdG1mX2hnIGNscmYgICAgZHRtZl9zbCAgICAgICAgIDsgQ2xlYXIgc3VtDQog ICAgICAgIGNscmYgICAgZHRtZl9zaA0KICAgICAgICBjbHJmICAgIGR0bWZfbWwgICAgICAg ICA7IENsZWFyIG1heA0KICAgICAgICBjbHJmICAgIGR0bWZfbWgNCiAgICAgICAgY2xyZiAg ICBkdG1mX3JyICAgICAgICAgOyBUb25lIDANCiAgICAgICAgbW92bHcgICBUT05FSDANCiAg ICAgICAgbW92d2YgICBkdG1mX3RjYyAgICAgICAgOyBTZXQgdGltZXIgY29uc3RhbnQgZm9y IGhpZ2ggdG9uZSAwLg0KICAgICAgICBjYWxsICAgIGR0bWZfc2FtcCAgICAgICA7IFNhbXBs ZSBldGMuDQogICAgICAgIGluY2YgICAgZHRtZl9ycg0KICAgICAgICBtb3ZsdyAgIFRPTkVI MQ0KICAgICAgICBtb3Z3ZiAgIGR0bWZfdGNjICAgICAgICA7IFNldCB0aW1lciBjb25zdGFu dCBmb3IgaGlnaCB0b25lIDEuDQogICAgICAgIGNhbGwgICAgZHRtZl9zYW1wICAgICAgIDsg U2FtcGxlIGV0Yy4NCiAgICAgICAgaW5jZiAgICBkdG1mX3JyDQogICAgICAgIG1vdmx3ICAg VE9ORUgyDQogICAgICAgIG1vdndmICAgZHRtZl90Y2MgICAgICAgIDsgU2V0IHRpbWVyIGNv bnN0YW50IGZvciBoaWdoIHRvbmUgMi4NCiAgICAgICAgY2FsbCAgICBkdG1mX3NhbXAgICAg ICAgOyBTYW1wbGUgZXRjLg0KICAgICAgICBpbmNmICAgIGR0bWZfcnINCiAgICAgICAgbW92 bHcgICBUT05FSDMNCiAgICAgICAgbW92d2YgICBkdG1mX3RjYyAgICAgICAgOyBTZXQgdGlt ZXIgY29uc3RhbnQgZm9yIGhpZ2ggdG9uZSAzLg0KICAgICAgICBjYWxsICAgIGR0bWZfc2Ft cCAgICAgICA7IFNhbXBsZSBldGMuDQogICAgICAgIGdvdG8gICAgZHRtZl9nICAgICAgICAg IDsgR28gdG8gY29tbW9uIHByb2Nlc3NpbmcgZm9yIGxvLCBoaSBncm91cHMNCg0KOw0KOyBU aGlzIHJvdXRpbmUgcGVyZm9ybXMgYWxsIHNhbXBsZXMgZm9yIGEgcGFydGljdWxhciB0b25l LiAgSXQgc2VsZWN0cw0KOyB0aGUgbGFyZ2VzdCBjb3JyZWxhdGlvbiBpbnRvIGR0bWZfdDFs L2ggKHdoaWNoIGlzIHRoZSByZXR1cm4gdmFsdWUpLg0KOw0KZHRtZl9zYW1wIG1vdmx3IFNB TVBTUEMqV0FWRVMgICA7IFRvdGFsIHNhbXBsZXMNCiAgICAgICAgbW92d2YgICBkdG1mX3Nj ICAgICAgICAgOyBtb3ZlIHRvIHNhbXBsZSBjb3VudGVyDQogICAgICAgIGNscmYgICAgZHRt Zl9zdCAgICAgICAgIDsgSW5pdGlhbCBzdGF0ZQ0KICAgICAgICBjbHJmICAgIGR0bWZfdDFs ICAgICAgICA7IENsZWFyIGNvcnJlbGF0aW9uIGFjY3VtdWxhdG9ycw0KICAgICAgICBjbHJm ICAgIGR0bWZfdDFoDQogICAgICAgIGNscmYgICAgZHRtZl90MmwNCiAgICAgICAgY2xyZiAg ICBkdG1mX3QyaA0KOw0KOyBNYWluIHNhbXBsZSBsb29wLiAgVGhlIGNvZGUgaXMgd3JpdHRl biB0byB0YWtlIGEgY29uc3RhbnQgbnVtYmVyIG9mDQo7IGN5Y2xlcyBubyBtYXR0ZXIgd2hh dC4gIFRoaXMgZXhwbGFpbnMgc29tZSBvZiB0aGUgb2RkIHRoaW5ncyBsaWtlDQo7IHNlZW1p bmdseSB1bm5lY2Vzc2FyeSBnb3RvJ3MuDQo7DQpkdG1mX2xwIG1vdmYgICAgcG9ydGIsdyAg ICAgICAgIDsgMSAtIEdldCBzYW1wbGUgKGUuZy4gZnJvbSBwb3J0IEIpDQogICAgICAgIG1v dndmICAgZHRtZl9jcyAgICAgICAgIDsgMiAtU2F2ZSBpdA0KICAgICAgICBtb3ZsdyAgIGhp Z2ggZHRtZl9ic3RhdGUgOyAzDQogICAgICAgIG1vdndmICAgcGNsYXRoICAgICAgICAgIDsg NA0KICAgICAgICBtb3ZmICAgIGR0bWZfc3QsdyAgICAgICA7IDUgLSBHZXQgY3VycmVudCBz dGF0ZQ0KICAgICAgICBhZGR3ZiAgIHBjbCxmICAgICAgICAgICA7IDYsNyAtIEJyYW5jaCBv biBzdGF0ZSAoMC0zKQ0KZHRtZl9ic3RhdGUNCiAgICAgICAgZ290byAgICBkdG1mX3N0MCAg ICAgICAgOyA4LDkgLSBDaGVjayBhc20gbGlzdCB0byBtYWtlIHN1cmUgYWxsDQogICAgICAg IGdvdG8gICAgZHRtZl9zdDEgICAgICAgIDsgb2YgdGhlc2UgNCBpbnN0cidzIG9uIHNhbWUg MjU2LWJ5dGUgcGFnZQ0KICAgICAgICBnb3RvICAgIGR0bWZfc3QyICAgICAgICA7DQogICAg ICAgIGdvdG8gICAgZHRtZl9zdDMgICAgICAgIDsNCg0KZHRtZl9zdDAgbW92ZiAgIGR0bWZf Y3MsdyAgICAgICA7IDEwIC0gR2V0IHNhbXBsZQ0KICAgICAgICBhZGR3ZiAgIGR0bWZfdDFs LGYgICAgICA7IDExIC0gQWRkIHRvIGFjY3VtdWxhdG9yDQogICAgICAgIGJ0ZnNjICAgc3Rh dHVzLEMgICAgICAgIDsgMTIsMTMgLSBUZXN0IGNhcnJ5IG91dA0KICAgICAgICBpbmNmICAg IGR0bWZfdDFoICAgICAgICA7IDEzIC0gSW5jcmVtZW50IGhpZ2ggYnl0ZSBpZiBjYXJyeSBv dXQNCiAgICAgICAgZ290byAgICBkdG1mX2pvaW4gICAgICAgOyAxNCwxNSAtIGNvbnRpbnVl IGNvbW1vbg0KDQpkdG1mX3N0MSBtb3ZmICAgZHRtZl9jcyx3ICAgICAgIDsgR2V0IHNhbXBs ZQ0KICAgICAgICBhZGR3ZiAgIGR0bWZfdDJsLGYgICAgICA7IEFkZCB0byBhY2N1bXVsYXRv cg0KICAgICAgICBidGZzYyAgIHN0YXR1cyxDICAgICAgICA7IFRlc3QgY2Fycnkgb3V0DQog ICAgICAgIGluY2YgICAgZHRtZl90MmggICAgICAgIDsgSW5jcmVtZW50IGhpZ2ggYnl0ZSBp ZiBjYXJyeSBvdXQNCiAgICAgICAgZ290byAgICBkdG1mX2pvaW4gICAgICAgOyBjb250aW51 ZSBjb21tb24NCg0KZHRtZl9zdDIgY29tZiAgIGR0bWZfY3MsdyAgICAgICA7IEdldCAnbmVn YXRpdmUnIHNhbXBsZQ0KICAgICAgICBhZGR3ZiAgIGR0bWZfdDFsLGYgICAgICA7IEFkZCB0 byBhY2N1bXVsYXRvcg0KICAgICAgICBidGZzYyAgIHN0YXR1cyxDICAgICAgICA7IFRlc3Qg Y2Fycnkgb3V0DQogICAgICAgIGluY2YgICAgZHRtZl90MWggICAgICAgIDsgSW5jcmVtZW50 IGhpZ2ggYnl0ZSBpZiBjYXJyeSBvdXQNCiAgICAgICAgZ290byAgICBkdG1mX2pvaW4gICAg ICAgOyBjb250aW51ZSBjb21tb24NCg0KZHRtZl9zdDMgY29tZiAgIGR0bWZfY3MsdyAgICAg ICA7IEdldCAnbmVnYXRpdmUnIHNhbXBsZQ0KICAgICAgICBhZGR3ZiAgIGR0bWZfdDJsLGYg ICAgICA7IEFkZCB0byBhY2N1bXVsYXRvcg0KICAgICAgICBidGZzYyAgIHN0YXR1cyxDICAg ICAgICA7IFRlc3QgY2Fycnkgb3V0DQogICAgICAgIGluY2YgICAgZHRtZl90MmggICAgICAg IDsgSW5jcmVtZW50IGhpZ2ggYnl0ZSBpZiBjYXJyeSBvdXQNCiAgICAgICAgZ290byAgICBk dG1mX2pvaW4gICAgICAgOyBjb250aW51ZSBjb21tb24NCg0KZHRtZl9qb2luIGluY2YgIGR0 bWZfc3QsdyAgICAgICA7IDE2DQogICAgICAgIGFuZGx3ICAgMyAgICAgICAgICAgICAgIDsg MTcNCiAgICAgICAgbW92d2YgICBkdG1mX3N0ICAgICAgICAgOyAxOCAtIFVwZGF0ZSBzdGF0 ZQ0KICAgICAgICBkZWNmc3ogIGR0bWZfc2MgICAgICAgICA7IDE5LDIwIC0gRGVjcmVtZW50 IHNhbXBsZSBjb3VudA0KICAgICAgICBnb3RvICAgIGR0bWZfdG1yICAgICAgICA7IDIwLDIx IC0gSWYgbm90IGZpbmlzaGVkLCBzYW1wbGUgYWdhaW4NCg0KOyBGaW5pc2hlZCBzYW1wbGVz LCBzZWxlY3QgbGFyZ2VzdCBmcm9tIGR0bWZfdDEgYW5kIGR0bWZfdDIgaW50byBkdG1mX3Qx Lg0KOyBBdmVyYWdlIGV4cGVjdGVkIHZhbHVlIGlzIHN1YnRyYWN0ZWQsIGFicyB2YWx1ZSB0 YWtlbi4gIEF2ZyBleHBlY3RlZA0KOyB2YWx1ZSBpcyBXQVZFUyBpbiBoaWdoIGJ5dGUsIHpl cm8gaW4gbG93IGJ5dGUuDQpkdG1mX2x4IG1vdmx3ICAgV0FWRVMNCiAgICAgICAgc3Vid2Yg ICBkdG1mX3QxaCxmICAgICAgOyB0MSAtPSBleHBhdmcNCiAgICAgICAgYnRmc3MgICBkdG1m X3QxaCw3ICAgICAgOyB0MSAtdmU/DQogICAgICAgIGdvdG8gICAgJCszICAgICAgICAgICAg IDsgbm8sIHNraXAgbmV4dA0KICAgICAgICBjb21mICAgIGR0bWZfdDFoICAgICAgICA7IE5l Z2F0ZSAoZG9uJ3Qgd29ycnkgYWJvdXQgdGhlIDEgZGlmZiEpDQogICAgICAgIGNvbWYgICAg ZHRtZl90MWwNCiAgICAgICAgbW92bHcgICBXQVZFUw0KICAgICAgICBzdWJ3ZiAgIGR0bWZf dDJoLGYgICAgICA7IHQyIC09IGV4cGF2Zw0KICAgICAgICBidGZzcyAgIGR0bWZfdDJoLDcg ICAgICA7IHQyIC12ZT8NCiAgICAgICAgZ290byAgICAkKzMgICAgICAgICAgICAgOyBubywg c2tpcCBuZXh0DQogICAgICAgIGNvbWYgICAgZHRtZl90MmgNCiAgICAgICAgY29tZiAgICBk dG1mX3QybA0KICAgICAgICBtb3ZmICAgIGR0bWZfdDFoLHcNCiAgICAgICAgc3Vid2YgICBk dG1mX3QyaCx3ICAgICAgOyB3ID0gdDJoLXQxaCAoQyBzZXQgaWYgdDFoPD10MmgpDQogICAg ICAgIGJ0ZnNzICAgc3RhdHVzLEMNCiAgICAgICAgZ290byAgICBkdG1mXzA0ICAgICAgICAg OyBjb250IGlmIHQxID4gdDINCiAgICAgICAgYnRmc3MgICBzdGF0dXMsWg0KICAgICAgICBn b3RvICAgIGR0bWZfc3dhcCAgICAgICA7IG1vdmUgdDItPnQxIGlmIHQyPnQxDQogICAgICAg IG1vdmYgICAgZHRtZl90MWwsdyAgICAgIDsgaGlnaCBlcXVhbCwgdGVzdCBsb3cNCiAgICAg ICAgc3Vid2YgICBkdG1mX3QybCx3ICAgICAgOyB3ID0gdDJsLXQxbA0KICAgICAgICBidGZz cyAgIHN0YXR1cyxDDQogICAgICAgIGdvdG8gICAgZHRtZl8wNCAgICAgICAgIDsgY29udCBp ZiB0MSA+IHQyDQpkdG1mX3N3YXAgbW92ZiAgZHRtZl90MmgsdyAgICAgIDsgU2V0IHQxID0g dDIgKHJldHVybiB2YWx1ZSkNCiAgICAgICAgbW92d2YgICBkdG1mX3QxaA0KICAgICAgICBt b3ZmICAgIGR0bWZfdDJsLHcNCiAgICAgICAgbW92d2YgICBkdG1mX3QxbA0KOw0KOyBTdW0u DQpkdG1mXzA0IG1vdmYgICAgZHRtZl90MWwsdw0KICAgICAgICBhZGR3ZiAgIGR0bWZfc2ws Zg0KICAgICAgICBtb3ZmICAgIGR0bWZfdDFoLHcNCiAgICAgICAgYnRmc2MgICBzdGF0dXMs Qw0KICAgICAgICBhZGRsdyAgIDENCiAgICAgICAgYWRkd2YgICBkdG1mX3NoLGYNCjsNCjsg Q29tcGFyZSB3aXRoIGN1cnJlbnQgbWF4aW11bS4gIElmIGdyZWF0ZXIsIHNldCBuZXcgbWF4 Lg0KZHRtZl8wNSBtb3ZmICAgIGR0bWZfbWgsdw0KICAgICAgICBzdWJ3ZiAgIGR0bWZfdDFo LHcgICAgICA7IHcgPSB0MWgtbWggKEMgc2V0IGlmIG1oPD10MWgpDQogICAgICAgIGJ0ZnNz ICAgc3RhdHVzLEMNCiAgICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgOyByZXQgaWYg bSA+IHQxDQogICAgICAgIGJ0ZnNzICAgc3RhdHVzLFoNCiAgICAgICAgZ290byAgICBkdG1m X3N3MiAgICAgICAgOyBtb3ZlIHQxLT5tIGlmIHQxPm0NCiAgICAgICAgbW92ZiAgICBkdG1m X21sLHcgICAgICAgOyBoaWdoIGVxdWFsLCB0ZXN0IGxvdw0KICAgICAgICBzdWJ3ZiAgIGR0 bWZfdDFsLHcgICAgICA7IHcgPSB0MWwtbWwNCiAgICAgICAgYnRmc3MgICBzdGF0dXMsQw0K ICAgICAgICByZXR1cm4gICAgICAgICAgICAgICAgICA7IHJldCBpZiBtID4gdDENCmR0bWZf c3cyIG1vdmYgICBkdG1mX3QxaCx3ICAgICAgOyBTZXQgbSA9IHQxDQogICAgICAgIG1vdndm ICAgZHRtZl9taA0KICAgICAgICBtb3ZmICAgIGR0bWZfdDFsLHcNCiAgICAgICAgbW92d2Yg ICBkdG1mX21sDQogICAgICAgIG1vdmYgICAgZHRtZl9ycix3ICAgICAgIDsgVG9uZSBudW1i ZXINCiAgICAgICAgbW92d2YgICBkdG1mX3IgICAgICAgICAgOyBTZXQgbmV3IHRvbmUgbnVt YmVyDQogICAgICAgIHJldHVybg0KDQo7IFdhc3RlIHRpbWUgdW50aWwgcmVhZHkgZm9yIG5l eHQgc2FtcGxlDQpkdG1mX3RtciBtb3ZsdyAgRklYRExBWSAgICAgICAgIDsgMjIgLSBDb25z dGFudCBkZWxheQ0KICAgICAgICBtb3Z3ZiAgIGR0bWZfdGMgICAgICAgICA7IDIzDQogICAg ICAgIGRlY2ZzeiAgZHRtZl90YyAgICAgICAgIDsgMjQsMjUNCiAgICAgICAgZ290byAgICAk LTEgICAgICAgICAgICAgOw0KICAgICAgICBtb3ZmICAgIGR0bWZfdGNjLHcgICAgICA7IDI2 KzMobi0xKQ0KICAgICAgICBtb3Z3ZiAgIGR0bWZfdGMgICAgICAgICA7IDI3IC0gTG9hZCB0 aWNrIGNvdW50ZXIgY29uc3RhbnQNCmR0bWZfd3RpbSBkZWNmc3ogZHRtZl90YyAgICAgICAg OyBEZWNyZW1lbnQgdGljayBjb3VudGVyDQogICAgICAgIGdvdG8gICAgZHRtZl93dGltICAg ICAgIDsgVGlnaHQgbG9vcCB1bnRpbCB6ZXJvDQogICAgICAgIGdvdG8gICAgZHRtZl9scCAg ICAgICAgIDsgMjgsMjkgLSBHZXQgbmV4dCBzYW1wbGUNCg0KDQoNCiAgICAgICAgZW5kDQoN Cgw= --------------090501040906060407020202 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline -- http://www.piclist.com PIC/SX FAQ & list archive View/change your membership options at http://mailman.mit.edu/mailman/listinfo/piclist --------------090501040906060407020202--